我在Macbook上使用OpenCV 2.4和python 2.7.5。我想用以下代码显示内置摄像机的实时流:

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)
    print type(frame)
    #cv.ShowImage("w1", frame)
    c = cv.WaitKey(10)
while True:
    repeat()

但是,似乎QueryFrame并不总是返回一个iplimage,这是我在终端上得到的:
<type 'NoneType'>
<type 'NoneType'>
<type 'NoneType'>
<type 'NoneType'>
<type 'NoneType'>
<type 'NoneType'>
<type 'NoneType'>
<type 'NoneType'>
<type 'NoneType'>
<type 'NoneType'>
<type 'NoneType'>
<type 'NoneType'>
<type 'NoneType'>
<type 'NoneType'>
<type 'cv2.cv.iplimage'>
<type 'NoneType'>
<type 'NoneType'>
<type 'cv2.cv.iplimage'>
<type 'NoneType'>
<type 'NoneType'>
<type 'NoneType'>
<type 'cv2.cv.iplimage'>
<type 'NoneType'>
<type 'NoneType'>
<type 'cv2.cv.iplimage'>
<type 'NoneType'>

有人知道问题出在哪里吗?

谢谢

编辑:
我注意到打开相机需要花费几秒钟的时间,因此在输入“while”之前我花了一些时间。至于noneType问题,我不知道为什么每3帧就得到一张正确的图像。无论如何,我只是通过放置一个条件来“固定”它,以检查我们是否获得了正确的图像,这是代码:
import cv

cv.NamedWindow("w1", cv.CV_WINDOW_AUTOSIZE)
camera_index = 0
capture = cv.CaptureFromCAM(camera_index)
c = cv.WaitKey(5000)
def repeat():
    global capture #declare as globals since we are assigning to them now
    global camera_index
    frame = cv.QueryFrame(capture)

    if frame:

        cv.ShowImage("w1", frame)
    c = cv.WaitKey(10)
while True:
    repeat()

最佳答案

建议如下:

  • camera_index = -1
  • 放下第一帧以防万一

    firstImage = copy.deepcopy(cv.QueryFrame(capture))

  • 分享我的代码以供参考:
    import cv2 as cv
    import copy
    camera_index = -1
    
    capture = cv.CaptureFromCAM(camera_index)
    
    isRunning = True
    firstImage = copy.deepcopy(cv.QueryFrame(capture)) #drop first frame which might empty
    cv.NamedWindow("Webcam",  cv.CV_WINDOW_AUTOSIZE);
    
    def repeat():
        global capture #declare as globals since we are assigning to them now
        global camera_index
        global isRunning
        global firstImage
        currImage = cv.QueryFrame(capture)
        cv.ShowImage("Webcam",currImage)
        c = cv.WaitKey(10)
        if(c==27):
                isRunning = False
        if (c!=-1):
                print str(c)
    
    while isRunning:
        repeat()
    

    10-08 09:06