opencv视频录制

时间:2016-07-15 08:21:19

标签: python opencv wxpython raspberry-pi2

我正在尝试使用opencv来保存网络摄像头视频流。因为我使用了wxpython GUI窗口并且有按钮来记录。

import wx
import vlc
import time
import os
import user
import cv2, cv
import datetime

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")

# Bind controls to events
        self.Bind(wx.EVT_BUTTON, self.OnRecord, record)

# Give a pretty layout to the controls
        ctrlbox = wx.BoxSizer(wx.VERTICAL)
        box = wx.BoxSizer(wx.HORIZONTAL)

# box contains some buttons
        box.Add(record)

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

# -------begin capturing and saving video
    def OnRecord(self, evt):
        capture = cv.CaptureFromCAM(0)
        fps = 9
        size = (640, 480)

        writer = cv.CreateVideoWriter('video.avi', cv.CV_FOURCC('D', 'I', 'V', 'X'), fps, size);
        i = 0

        started = datetime.datetime.now()
        while i < 300:
            i += 1
            frame = cv.QueryFrame(capture)

            frame2 = cv.CreateImage(size, 8, 3)
            cv.CvtColor(frame, frame2, cv.CV_RGB2XYZ)


            cv.WriteFrame(writer, frame2)
            # cv.WaitKey(1000/fps)        

class ShowCapture(wx.Panel):

    def __init__(self, parent, capture, fps=24):
        wx.Panel.__init__(self, parent, wx.ID_ANY, (0,0), (640,480))

        self.capture = capture
        ret, frame = self.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(0)

app = wx.App(False)
frame = wx.Frame(None, title='CamGUI')
panel = MainWindow(frame,capture)
frame.Show()
app.MainLoop()

我在GUI窗口上获取了我的网络摄像头流,但是当我按下录制按钮时,它会抛出一个看起来像这样的错误

Traceback (most recent call last):
File "/home/pi/Record_test.py", line 77, in OnRecord
cv.CvtColor(frame, frame2, cv.CV_RGB2XYZ)
cv2.error: scn == 3 || scn == 4

可能是什么问题?

0 个答案:

没有答案