cv2 动作捕捉,.avi 文件被拉伸 - Python

cv2 motion capture, .avi files are stretched - Python

所以我试图让我的网络摄像头捕捉动作,我如何注册动作进行得很好,但是由于所有这些嵌套的 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()

您的代码可能 运行 非常快,并且可能会创建 ie。每秒 100 帧。

但是VideoWriter中的20.0并没有以每秒20帧的速度编写视频,它只是通知玩家他们必须每秒显示20帧。但是如果你每秒创建 100 帧,那么最终它需要 5 秒而不是 1 秒来显示它 (100frames/20FPS = 5seconds)。

每隔 50ms - (1000ms/20FPS) 你必须放慢速度创建新帧 - 你可以尝试 waitKey(50).

编辑:

因为代码可能需要一些时间来创建框架,所以它可能需要在 waitKey 中进行更小的处理 - 即 48 - 或者您可以尝试测量循环内的时间并使用

waitKey( 50 - (loop_end-loop_start) )

你 运行 内部 while-loop 总是写入相同的帧 - 你应该在这个 while-loop

中使用 ret, cur_frame = vid_capture.read()

更短:

name = datetime.now().strftime("%Y-%m-%d_%H-%M-%S.avi")
motion = (frame_diff.max() > 150) 

我看到一个可能的问题:当 window 关闭时 cv2.waitKey 不工作 - 因为系统只发送 keys/mouse 事件给活动的 window,当 [=51] =] 关闭则 cv2 可能无法获得 keys/mouse 事件。


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()