2017-03-09 103 views
1

所以我有一個程序,我分配不同的按鍵到不同的功能。我正在使用cv2.waitKey(0)逐個瀏覽框架。但是,當按下未分配功能的按鍵時,下一幀仍然被加載。如何防止未分配的按鍵加載循環中的下一幀?cv2.waitKey(0)沒有等待按下任意鍵 - OpenCV 3.1.0,Python3,Ubuntu

謝謝!

while (cap.isOpened()): 
frameclick = cv2.waitKey(0) 
ret, frame = cap.read() 
cv2.imshow('frame',frame) 

if frameclick == ord('a'): 
    swingTag() 

elif frameclick == ord('r'): 
    rewindFrames() 

elif frameclick == ord('s'): 
    stanceTag() 

elif frameclick == ord('d'): 
    unsureTag() 

elif frameclick == ord('q'): 
    with open((selectedvideostring + '.txt'), 'w') as textfile: 
     for item in framevalues: 
      textfile.write("{}\n".format(item)) 
    break 
+0

你identation看起來不正確。但更多的不應該等待imshow之前?編輯:我期望一個'else:continue'捕獲所有其他點擊並繼續到while循環的下一輪。 – Roelant

+0

道歉,當粘貼到SO時,縮進會丟失 - 我不確定我明白你的意思 - waitKey(0)在我的循環中的imshow之前? – KittenMittons

回答

0

正如@歐文的答覆中提到,試試:

while (cap.isOpened()): 
    ret, frame = cap.read() 

    # check if read frame was successful 
    if ret == False: break; 

    # show frame first 
    cv2.imshow('frame',frame) 

    # then waitKey -- and make it <= 255 
    frameclick = cv2.waitKey(0) & 0xFF 

    if frameclick == ord('a'): 
     swingTag() 

    elif frameclick == ord('r'): 
     rewindFrames() 

    elif frameclick == ord('s'): 
     stanceTag() 

    elif frameclick == ord('d'): 
     unsureTag() 

    elif frameclick == ord('q'): 
     with open((selectedvideostring + '.txt'), 'w') as textfile: 
      for item in framevalues: 
       textfile.write("{}\n".format(item)) 
     break 
+0

嘿,謝謝你的回覆 - 我試着實現上面的代碼(把'如果ret == False'的'break'放到正確的縮進下一行),我仍然遇到同樣的問題 – KittenMittons

+0

請參閱編輯額外位。另外,我確實遇到過Ubuntu因爲某種未知的原因搞亂了鍵盤代碼。如果你將'frameclick'打印到'stdout'更安全。 –

+0

歡呼的額外信息 - 即使更新我仍然得到同樣的問題 - 在此期間,我使用其他:打破如果錯誤的鍵被按下,但我試圖找到一種解決方法另一個按鍵就是不讀取並顯示一個新的幀 – KittenMittons

1

問題在於你的邏輯。你的程序進入while循環並等待一個鍵。然後,如果按下某個鍵,則讀取下一個幀,但此時程序不關心按下了哪個鍵。所以,你有你的下一個框架,只有這樣你才能檢查哪個按鈕被按下了,哪個按下了。

+0

爲輸入而歡呼,這有助於清除一些事情 – KittenMittons