2016-08-04 13 views
0

ウェブカムストリームを表示すると同時にビデオをファイルに書き込もうとしていますが、書き込み中はライブストリームがフリーズします。問題は、OpenCVがビデオを録画するためにループを使用し、プログラムがOpenCVループに詰まり、ユーザーが続行できなくなることです。ユーザーの応答を聞きません。どのように私は同時にビデオを録画し、ユーザーの応答を聞くことができますか?使用してIAMラズベリーパイビデオキャプチャがビデオに書き込み中にフリーズする

コード:

import wx 
import vlc 
import os 
import user 
import numpy as 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 

# The first panel holds the video and it's all black 

     self.videopanel = wx.Panel(self, -1)   
     self.videopanel.SetBackgroundColour(wx.BLACK) 

# The 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 to events 

     self.Bind(wx.EVT_BUTTON, self.OnRecord, record)  
     self.Bind(wx.EVT_BUTTON, self.OnEnd, end) 

# Give a pretty layout to the controls 

     ctrlbox = wx.BoxSizer(wx.VERTICAL)   
     box = wx.BoxSizer(wx.HORIZONTAL) 

# box contains some buttons and the volume controls 

     box.Add(record)  
     box.Add(end) 

# Merge box to the ctrlsizer 

     ctrlbox.Add(box, flag=wx.EXPAND, border=10)   
     ctrlpanel.SetSizer(ctrlbox) 

# Put everything 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() 

読むのが可能なラズベリーパイは/並列ビデオを書いたり、それがパイのパフォーマンスが痛いのか?

専門家のアドバイスを希望:)

答えて

0

を使用すると、アプリケーションの実行時に入力し、その他の変更をテストすることができますtimerを追加します。
wx.timer

関連する問題