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