2012-06-13 194 views
8

我想从使用python和OpenCV我的摄像头的视频流,该任务我实现了这个简单的代码:网络摄像头流和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() 

当我尝试执行它,我出现以下错误:

[email protected]:~/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

WaitKey是OpenCV中的一个重要组成部分:在这方面,作为同样的代码编写。许多人认为他们不需要等待击键并忽略它,但是如果没有它,GUI将不会运行,并且您的窗口将永远不会显示。 – Octopus

回答

21

您需要在最后添加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() 
+0

此代码不适用于我。我正在使用Python 2.7。我仍然得到了无效参数的错误。 – elaRosca

+0

哪一行显示你的错误? –

+0

这似乎不适用于我,也许opencv已经改变,也许是python。 dir(cv)显示方法名为Window()而不是NamedWindow(),并且VideoCapture似乎不是任何地方的方法。 – Mittenchops

1

下面的代码适用于Python 2.7版和OpenCV有建立蟒蛇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()