所以我試圖讓我的網路攝像頭捕捉動作,我如何注冊動作很好,但是所有這些嵌套的 while 回圈我的保存檔案被拖到 30 分鐘長,而不是像預期的 10 秒。我無法弄清楚我做錯了什么。
我所說的拖出是指我錄制了 10 秒,但是當我進入我的檔案查看素材時,它只是一些幀的 30 分鐘。
這個想法是讓它記錄運動,然后記錄 10 秒并將記錄保存為 .avi 檔案。
import cv2
from datetime import datetime
import time
vid_capture = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
ret, cur_frame = vid_capture.read()
prev_frame = cur_frame
capture_duration = 10
motion = False
while True:
frame_diff = cv2.absdiff(cv2.cvtColor(cur_frame, cv2.COLOR_BGR2GRAY), cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY))
if frame_diff.max() > 150:
motion = True
if motion:
start_time = time.time()
name = str(datetime.now().date()) "_" str(datetime.now().time().hour) "-" str(datetime.now().time().minute) "-" str(datetime.now().time().second) ".avi"
out = cv2.VideoWriter(name, fourcc, 20.0, (640,480))
ret, cur_frame = vid_capture.read()
while time.time() - start_time < capture_duration:
if ret:
out.write(cur_frame)
cv2.imshow('Input', cur_frame)
else:
break
out.release()
cv2.destroyAllWindows()
motion = False
prev_frame = cur_frame.copy()
ret, cur_frame = vid_capture.read()
if cv2.waitKey(1) == 27:
break
vid_capture.release()
uj5u.com熱心網友回復:
您的代碼可能運行得非常快,并且可能會創建 ie。每秒 100 幀。
但是20.0inVideoWriter不會以每秒 20 幀的速度撰寫視頻,而只會通知玩家他們必須每秒顯示 20 幀。但是,如果您每秒創建 100 幀,那么最終將需要 5 秒而不是 1 秒來顯示它(100frames/20FPS = 5seconds)。
你必須放慢速度來創建新的每一幀50ms-( 1000ms/20FPS)-你可以試試waitKey(50)。
編輯:
因為代碼可能需要一些時間來創建框架,所以它可能需要更小的處理waitKey- 即48- 或者您可以嘗試測量回圈內的時間并使用
waitKey( 50 - (loop_end-loop_start) )
你運行內部while回圈,它總是寫相同的幀 - 你應該ret, cur_frame = vid_capture.read()在這個while回圈中使用
更短:
name = datetime.now().strftime("%Y-%m-%d_%H-%M-%S.avi")
motion = (frame_diff.max() > 150)
我看到一個可能的問題:cv2.waitKey關閉視窗時不起作用 - 因為系統僅將鍵/滑鼠事件發送到活動視窗,而當視窗關閉時,cv2可能無法獲得鍵/滑鼠事件。
from datetime import datetime
import time
import cv2
vid_capture = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
ret, cur_frame = vid_capture.read()
prev_frame = cur_frame
capture_duration = 10
while True:
frame_diff = cv2.absdiff(cv2.cvtColor(cur_frame, cv2.COLOR_BGR2GRAY), cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY))
motion = (frame_diff.max() > 150)
if motion:
name = datetime.now().strftime("%Y-%m-%d_%H-%M-%S.avi")
print(name)
out = cv2.VideoWriter(name, fourcc, 20.0, (640,480))
start_time = time.time()
while time.time() - start_time <= capture_duration:
ret, cur_frame = vid_capture.read()
if ret:
out.write(cur_frame)
cv2.imshow(name, cur_frame)
if cv2.waitKey(50) == 27:
break
else:
break
out.release()
cv2.destroyAllWindows()
prev_frame = cur_frame.copy()
ret, cur_frame = vid_capture.read()
if cv2.waitKey(1) == 27:
break
vid_capture.release()
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/442194.html
