我想使用python和OpenCV从我的网络摄像头获取视频流,为此任务我实现了这个简单的代码:
import cv
cv.NamedWindow("w1", cv.CV_WINDOW_AUTOSIZE)
capture = cv.CaptureFromCAM(0)
def repeat():
frame = cv.QueryFrame(capture)
cv.ShowImage("w1", frame)
while True:
repeat()
当我尝试执行它时,我收到以下错误:
andfoy@ubuntu:~/Python$ python camera.py
VIDIOC_QUERYMENU: Argumento inválido
VIDIOC_QUERYMENU: Argumento inválido
VIDIOC_QUERYMENU: Argumento inválido
我按其他帖子的建议更改了以下行:
capture = cv.CaptureFromCAM(0)
为:
capture = cv.CaptureFromCAM(-1)
但错误仍然存在。
答案 0 :(得分:22)
您需要在结尾处添加waitkey
功能。
下面的代码对我来说很好。
import cv
cv.NamedWindow("w1", cv.CV_WINDOW_AUTOSIZE)
capture = cv.CaptureFromCAM(0)
def repeat():
frame = cv.QueryFrame(capture)
cv.ShowImage("w1", frame)
while True:
repeat()
if cv.WaitKey(33)==27:
break
cv.DestroyAllWindows()
如果你不知道,现在的OpenCV使用新的python api cv2
,它有很多功能。在那里,相同的代码写为:
import cv2
import numpy as np
c = cv2.VideoCapture(0)
while(1):
_,f = c.read()
cv2.imshow('e2',f)
if cv2.waitKey(5)==27:
break
cv2.destroyAllWindows()
答案 1 :(得分:1)
下面的代码适用于python 2.7和opencv,它是为python 2.7构建的
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
if not(cap.isOpened()):
cap.open()
while(cap.isOpened()):
ret, frame = cap.read()
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()