我想使用opencv和python从连接到计算机的2个网络摄像头捕获图像。这是我写的代码:

    #to take snapshot from two webcams simultaneously
    import cv2
    import cv2.cv as cv
    import numpy as np
    left = cv2.VideoCapture(1)  #capturing video from device port 1 aka webcam1
    right = cv2.VideoCapture(2) #capturing video from device port 2 aka webcam2
    capture_left=cv.CaptureFromCAM(1)
    capture_right =cv.CaptureFromCAM(2)
    while(True):
       ret,frameL = left.read()
       ret1,frameR = right.read()
       rgb_left = cv2.cvtColor(frameL,0)
       rgb_right = cv2.cvtColor(frameR,0)
       cv2.imshow('frameL',rgb_left)
       cv2.imshow('frameR',rgb_right)
       k=cv2.waitKey(0)
       if k == 27:         # wait for ESC key to break
           break
        elif k == 32: # wait for spacebar to click snapshot
           il=cv.QueryFrame(capture_left)
           cv.SaveImage("defaultL.jpg",il)
           ir=cv.QueryFrame(capture_right)
           cv.SaveImage("defaultR.jpg",ir)

    left.release()
    right.release()
    cv2.destroyAllWindows()

但是在执行时,这是错误:
OpenCV错误:在cv::cvtColor文件........ \ opencv \ modules \ imgproc \ src \ color.cpp,第3648行中,断言失败(scn == 3 || scn == 4)
追溯(最近一次通话):
文件“C:\ Users \ Administrator \ Desktop \ capturing.py”,第15行,在
rgb_right = cv2.cvtColor(frameR,0)
cv2.error:........ \ opencv \ modules \ imgproc \ src \ color.cpp:3648:error:(-215)scn == 3 || scn == 4在函数cv::cvtColor中

[在1.5秒内完成,退出代码为1]

最佳答案

添加以下行以检查数据。如果有数据,则处理,否则,继续

if np.shape(frameL) == ():
       do nothing and let it pass
else
       do the shit you want

if np.shape(frameR) == ():
       do nothing and let it pass
else
       do the shit you want

另外,添加 channel 检查
if(len(frameL.shape)>2)
     rgb_left = cv2.cvtColor(frameL,0)
else
     rgb_left = frameL

应该解决所有断言失败的问题

PS。这种方法可能不会同时提供数据。因此,不要期望完美的立体声深度输出。

如果要同时真实拍摄,则需要硬件同步,即相机的触发器。然后是摄像机流的多线程事件句柄。然后绑定(bind)数据进行处理。

我使用C++做过类似的事情。 python不太确定整个过程。

这是从经验上讲。

10-04 22:57