Mit*_*tch 55 python webcam opencv
我一直在尝试使用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()
在一个不相关的说明中,我注意到我的网络摄像头有时会更改其索引号cv.CaptureFromCAM,有时我需要输入0,1或2,即使我只连接了一台摄像机而且我没有拔掉它(我知道因为除非我改变指数,否则光不亮.有没有办法让Python确定正确的索引?
sas*_*nin 74
更新以显示如何在最新版本的OpenCV中执行此操作:
import cv2
cv2.namedWindow("preview")
vc = cv2.VideoCapture(0)
if vc.isOpened(): # try to get the first frame
    rval, frame = vc.read()
else:
    rval = False
while rval:
    cv2.imshow("preview", frame)
    rval, frame = vc.read()
    key = cv2.waitKey(20)
    if key == 27: # exit on ESC
        break
cv2.destroyWindow("preview")
vc.release()
它适用于OpenCV-2.4.2.
Mat*_*ehm 41
尝试c = cv.WaitKey(10)在repeat()方法底部添加该行.
等待10毫秒,用户输入密钥.即使你根本没有使用密钥,也要把它放进去.我认为只需要一些延迟,所以time.sleep(10)也可以工作.
关于相机索引,你可以这样做:
for i in range(3):
    capture = cv.CaptureFromCAM(i)
    if capture: break
这将找到第一个"工作"捕获设备的索引,至少对于0-2的索引.您的计算机中可能有多个设备被识别为正确的捕获设备.我知道确认你有正确的唯一方法是手动查看你的灯.也许得到一个图像并检查其属性?
要向进程添加用户提示,可以将键绑定到重复循环中的切换摄像头:
import cv
cv.NamedWindow("w1", cv.CV_WINDOW_AUTOSIZE)
camera_index = 0
capture = cv.CaptureFromCAM(camera_index)
def repeat():
    global capture #declare as globals since we are assigning to them now
    global camera_index
    frame = cv.QueryFrame(capture)
    cv.ShowImage("w1", frame)
    c = cv.WaitKey(10)
    if(c=="n"): #in "n" key is pressed while the popup window is in focus
        camera_index += 1 #try the next camera index
        capture = cv.CaptureFromCAM(camera_index)
        if not capture: #if the next camera index didn't work, reset to 0.
            camera_index = 0
            capture = cv.CaptureFromCAM(camera_index)
while True:
    repeat()
免责声明:我没有对此进行过测试,因此它可能存在错误或只是不起作用,但可能至少会让您了解一种解决方法.