记录和显示opencv网络摄像头视频

时间:2016-07-16 06:37:01

标签: python-2.7 opencv wxpython raspberry-pi2

我正在尝试使用wx按钮保存网络摄像头直播。

这是我的代码

import wx
import vlc
import numpy as np
import time
import os
import user
import 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))
        videoBoxSizer.Add(videoFrame,0)
        capture = ShowCapture(videoFrame, capture)
        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 = 8
        size = (640, 480)

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

        while i < 1000:
             frame = cv.QueryFrame(capture)

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

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

class ShowCapture(wx.Panel):

def __init__(self, parent, capture, fps=9):
    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()

我需要显示一个Rasberry-pi网络摄像头的实时流,并记录下来。 cv2.VideoCapture(0)不会录制视频,cv.CaptureFromCAM(0)也不会显示直播。所以,我在相同的代码中使用了两个,但我最终得到错误。

我有一个网络摄像头直播但是当我按下录制按钮时会抛出一个看起来像这样的错误。

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

希望获得一些专家建议:)

注意 - 我正在使用Raspberry-pi。

0 个答案:

没有答案