使用opencv将模拟视频抓取到python中

时间:2014-02-14 22:54:40

标签: python opencv video

好吧,似乎我的问题之前已被多次询问,不幸的是,没有人回复。我希望有人会帮忙。

我有一个Easycap设备,可以通过USB端口将模拟摄像头的模拟图像转换为数字信号。

设备在“设备管理器”中的“声音,视频和游戏控制器”类别中标识为“SMI Grabber设备”。

我使用简单的Python代码来显示来自此设备的视频。我的笔记本电脑也有嵌入式网络摄像头。

import numpy as np
import cv2
cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Display the resulting frame
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    if cv2.waitKey(1) & 0xFF == ord('s'):
        cv2.imwrite('screenshot.jpg',frame)



# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

首先,当我拔下Easycap时,CaptureVideo(0)返回嵌入式网络摄像头视频流。但是,当我插入Easycap时,会出现错误:

“Traceback(最近一次调用最后一次):   文件“C:\ Users \ DELL \ Desktop \ code \ cam.py”,第10行,in     cv2.imshow( '帧',帧) 错误:...... \ src \ opencv \ modules \ highgui \ src \ window.cpp:261:错误:(-215)size.width> 0&& size.height大于0"

请注意,除0之外的任何数字都会使程序显示网络摄像头图像。因此,如果我尝试cap = cv2.CaptureVideo(1),则会显示网络摄像头,cap = cv2.CaptureVideo(20)是相同的。

我还尝试在VideoCapture构造函数中输入“SMI Grabber Device”而不是0或1,但它没有任何区别。

我正在使用Windows 8,我已经为Easycap安装了附带的驱动程序。驱动程序附带的软件(称为ULead)工作正常并显示CCTV摄像机视频。我试图在关闭该程序时显示图像,但没有,结果是一样的。

我在使用Aforge库的C#程序之前使用了getCamList方法,或者允许我从comboBox中选择要显示的特定设备。我找不到类似的功能是opencv。

我正在使用OpenCV 2.4.6。我没有尝试以前版本的代码。

我真的需要理解为什么这段代码不起作用,因为我知道我只是opencv和图像处理的初学者。

我希望有人可以提供帮助。

2 个答案:

答案 0 :(得分:2)

我也在使用EasyCAP。 您必须检查 ret 是否为True。

我在代码

下面使用
   while True:
      ret, frame = vc.read()
      if ret:
         break
      cv2.waitKey(10)
   h, w = frame.shape[:2]
   print h, w

   while True:
      ret, frame = vc.read()
      if ret:
         cv2.imshow(WID, frame)
      if cv2.waitKey(1) == 27:
        break

答案 1 :(得分:1)

让光亮!

严肃地说,我在同样的问题上挣扎,我希望这会有所帮助!

the original thread + answer