我注意到一個我在文檔中沒有找到答案的行為。當我使用 VideoCapture(0) 從相機捕獲流時,檢查下面的代碼,我注意到由于我在代碼中放入的延遲,一些幀被跳過。但是當我播放視頻時,它不會跳過幀。cap = cv2.VideoCapture(0)#cap = cv2.VideoCapture("awesomevideo.mp4") while True : # Get a new frame from camera retval, frame = cap.read() time.sleep(1) # Display images cv2.imshow("frame", frame)我是否正確理解了這種行為,或者這是我的代碼的問題?當然,這只是一個測試腳本,當我處理來自相機的流時,我注意到了這個問題,我的 while 循環將花費 0.4 秒,然后它會抓取下一幀(它會跳過中間的一些幀),但是當我保存時同樣的視頻并決定進行離線處理,我注意到它不會跳過幀,即,它只是等到我處理完幀才給我下一個,不像相機那樣只抓取相機現在顯示的任何內容。
1 回答

RISEBY
TA貢獻1856條經驗 獲得超5個贊
您無法獲得現實世界中的所有幀。幀速率將是無限的,這是不可能的。相機嘗試在捕獲持續時間和處理時間的限制內捕獲盡可能多的幀。通過添加sleep
,您可以增加處理時間。
錄制的視頻具有來自現實世界的離散幀樣本,這足以讓我們感知流,就好像它無限流動一樣。人眼每秒捕獲 24 幀。如果視頻的目的是用于鳥類,則幀速率應至少為 80。
知道了這些,應該就清楚為什么VideoCapture
會像你說的那樣了。相機試圖從現實世界中捕捉盡可能多的幀。對于錄制的視頻,您已經擁有了所有幀。
作為腳注,出于顯示目的,您應該使用 aftercv2.waitKey(1)
而不是time.sleep(1)
after 。
添加回答
舉報
0/150
提交
取消