好吧,似乎我的问题之前已被多次询问,不幸的是,没有人回复。我希望有人会帮忙。
我有一个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和图像处理的初学者。
我希望有人可以提供帮助。
答案 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)