2016-09-21 1105 views
0

我写了一个脚本来显示从我的网络摄影机的深度图:opencv的摄像头脚本无休止地打开摄像头和关闭

cam_a = int(sys.argv[1]) 
cam_b = int(sys.argv[2]) 


while True: 
    imgl = cv2.VideoCapture(cam_a).read()[1] 
    imgL = cv2.cvtColor(imgl, cv2.COLOR_BGR2GRAY) 

    imgr = cv2.VideoCapture(cam_b).read()[1] 
    imgR = cv2.cvtColor(imgr, cv2.COLOR_BGR2GRAY) 


    stereo = cv2.StereoBM(cv2.STEREO_BM_BASIC_PRESET,ndisparities=16, SADWindowSize=15) 
    disparity = stereo.compute(imgL,imgR) 

    cv2.imshow('Disparity', disparity) 

虽然它不给我一个错误,它闪光我的两个摄像头断断续续地,无止境地。我担心这可能会打破我的网络摄像头,我怎么能阻止它?

编辑

于是,我改变了它,使它只显示一个相机作为普通视频:

while True: 
    imgl = cv2.VideoCapture(cam_a).read()[1] 
    imgL = cv2.cvtColor(imgl, cv2.COLOR_BGR2GRAY) 

    #imgr = cv2.VideoCapture(cam_b).read()[1] 
    #imgR = cv2.cvtColor(imgr, cv2.COLOR_BGR2GRAY) 


    #stereo = cv2.StereoBM(cv2.STEREO_BM_BASIC_PRESET,ndisparities=16, SADWindowSize=15) 
    #disparity = stereo.compute(imgL,imgR) 

    cv2.imshow('Disparity', imgL) 
    cv2.waitKey(10) 

仍然只是闪烁的相机和关闭。我不知道这里要改变什么。

回答

2

得到了问题。您正在不断地在while循环下启动视频捕捉对象。您应该使用while循环之前启动的一个实例,并使用该视频捕捉实例访问图像。看到这个例子并相应地改变你的代码,希望这将解决你的问题:

import cv2 
camera = cv2.VideoCapture(0) 
while True: 
    return_value,image = camera.read() 
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) 
    cv2.imshow('image',gray) 
    if cv2.waitKey(1)& 0xFF == ord('s'): 
     cv2.imwrite('test.jpg',image) 
     break 
camera.release() 
cv2.destroyAllWindows() 
0

所有你需要一个imshow后面加一个延时:

cv2.waitKey(10) 
+0

这没有奏效。它现在显示图像,但是我的两个网络摄像头(Logitech)仍然打开,然后关闭,然后打开,然后关闭等。 – Rich

+0

如果仅使用单个摄像头并仅更改一个摄像头的代码,会发生什么情况? –

+0

嘿,我添加了新的部分。 – Rich