i have been trying save webcam stream of raspberry pi using opencv videocapture. code is:
import wx import vlc import os import user import numpy np import time import cv, cv2 class mainwindow(wx.panel): def __init__(self, parent,capture): wx.panel.__init__(self, parent) mainsizer = wx.boxsizer(wx.vertical) # video videowarper = wx.staticbox(self,size=(640,480) videoboxsizer = wx.staticboxsizer(videowarper, wx.vertical) videoframe = wx.panel(self, -1,size=(640,480)) capture = showcapture(videoframe, capture) videoboxsizer.add(videoframe,0) mainsizer.add(videoboxsizer,0) parent.centre() self.show() self.setsizerandfit(mainsizer) # panels # first panel holds video , it's black self.videopanel = wx.panel(self, -1) self.videopanel.setbackgroundcolour(wx.black) # second panel holds controls ctrlpanel = wx.panel(self, -1 ) self.timeslider = wx.slider(ctrlpanel, -1, 0, 0, 1000) self.timeslider.setrange(0, 1000) record = wx.button(ctrlpanel, label="record") end = wx.button(ctrlpanel, label="end") # bind controls events self.bind(wx.evt_button, self.onrecord, record) self.bind(wx.evt_button, self.onend, end) # give pretty layout controls ctrlbox = wx.boxsizer(wx.vertical) box = wx.boxsizer(wx.horizontal) # box contains buttons , volume controls box.add(record) box.add(end) # merge box ctrlsizer ctrlbox.add(box, flag=wx.expand, border=10) ctrlpanel.setsizer(ctrlbox) # put togheter sizer = wx.boxsizer(wx.vertical) sizer.add(ctrlpanel, flag=wx.expand | wx.bottom | wx.top, border=10) self.setsizer(sizer) self.setminsize((350, 300)) # vlc player controls self.instance = vlc.instance() self.player = self.instance.media_player_new() def onrecord(self, evt): fourcc = cv2.cv.cv_fourcc('d', 'i', 'v', 'x') out = cv2.videowriter('video.avi', fourcc, 8.0, (640, 480)) counter = 0 while counter < 1: ret,frame = capture.read() out.write(frame) def onend(self, evt): out = cv2.videowriter('video.avi', fourcc, 8.0, (640, 480)) out.release() cv2.destroyallwindows() class showcapture(wx.panel): def __init__(self, parent, capture, fps=8): wx.panel.__init__(self, parent, wx.id_any, (0,0), (640,480)) self.capture = capture ret, frame = capture.read() height, width = frame.shape[:2] parent.setsize((width, height)) frame = cv2.cvtcolor(frame, cv2.color_bgr2rgb) self.bmp = wx.bitmapfrombuffer(width, height, frame) self.timer = wx.timer(self) self.timer.start(1000./fps) self.bind(wx.evt_paint, self.onpaint) self.bind(wx.evt_timer, self.nextframe) def onpaint(self, evt): dc = wx.bufferedpaintdc(self) dc.drawbitmap(self.bmp, 0, 0) def nextframe(self, event): ret, frame = self.capture.read() if ret: frame = cv2.cvtcolor(frame, cv2.color_bgr2rgb) self.bmp.copyfrombuffer(frame) self.refresh() capture = cv2.videocapture(-1) app = wx.app(false) frame = wx.frame(none, title='camgui') panel = mainwindow(frame, capture) frame.show() app.mainloop()
i have managed video stream inside gui window freezes after start record video , livestream struck though keep recording in background, until close python shell.
what might reason?
Comments
Post a Comment