2016-09-21 572 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