Python 删除openCV中无运动的帧
我正在尝试编写一个openCV程序,将视频分解为帧,然后逐个比较两帧,如果两帧相同,则拒绝该帧,否则将该帧附加到输出文件中 我怎样才能做到呢Python 删除openCV中无运动的帧,python,opencv,Python,Opencv,我正在尝试编写一个openCV程序,将视频分解为帧,然后逐个比较两帧,如果两帧相同,则拒绝该帧,否则将该帧附加到输出文件中 我怎样才能做到呢 OpenCV 2.4.13 Python 2.7以下示例从连接到系统的第一个摄像头捕获帧,将每个帧与前一帧进行比较,如果不同,则将帧添加到文件中。如果您坐在摄像机前不动,如果从控制台终端窗口运行程序,您可能会看到打印的诊断“无更改”消息 有许多方法可以测量一个帧与另一个帧的不同程度。为了简单起见,我们使用了新帧和前一帧之间的平均差值(与阈值相比),逐像素
OpenCV 2.4.13 Python 2.7以下示例从连接到系统的第一个摄像头捕获帧,将每个帧与前一帧进行比较,如果不同,则将帧添加到文件中。如果您坐在摄像机前不动,如果从控制台终端窗口运行程序,您可能会看到打印的诊断“无更改”消息 有许多方法可以测量一个帧与另一个帧的不同程度。为了简单起见,我们使用了新帧和前一帧之间的平均差值(与阈值相比),逐像素 请注意,openCV read函数将帧作为numpy数组返回
import numpy as np
import cv2
interval = 100
fps = 1000./interval
camnum = 0
outfilename = 'temp.avi'
threshold=100.
cap = cv2.VideoCapture(camnum)
ret, frame = cap.read()
height, width, nchannels = frame.shape
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter( outfilename,fourcc, fps, (width,height))
while(True):
# previous frame
frame0 = frame
# new frame
ret, frame = cap.read()
if not ret:
break
# how different is it?
if np.sum( np.absolute(frame-frame0) )/np.size(frame) > threshold:
out.write( frame )
else:
print( 'no change' )
# show it
cv2.imshow('Type "q" to close',frame)
# check for keystroke
key = cv2.waitKey(interval) & 0xFF
# exit if so-commanded
if key == ord('q'):
print('received key q' )
break
# When everything done, release the capture
cap.release()
out.release()
print('VideoDemo - exit' )
谢谢,它很有效。但是作为一个Noob问题,
interval=100 fps=1000./interval
do/代表什么?对waitKey()的调用采用一个超时参数(interval),指定为以毫秒为单位的间隔。对VideoWrite()的调用采用帧速率,指定为每秒帧数(fps)。通常情况下,在循环中会有某种定时控制来读取和写入视频帧。这里是通过waitKey()中的超时以近似方式提供的,实际帧速率略小于1000/间隔。但为了便于演示,它的距离足够近。因此,它允许高效地读取和写入视频。如果我理解正确的话,OpenCV应该注意视频的读写效率。非阻塞读写可能会在循环中节省一些时间,尽管这与效率严格来说并不相同。一种方法是使用三个线程和两个队列。一个线程读取帧并将其植入第二个线程,第二个线程比较图像并将接受的帧排入队列,第三个线程将其写入磁盘。这也将清除计时,因为您只需要准确地对读取循环计时。@DrM您是如何选择阈值100
?