Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除openCV中无运动的帧_Python_Opencv - Fatal编程技术网

Python 删除openCV中无运动的帧

Python 删除openCV中无运动的帧,python,opencv,Python,Opencv,我正在尝试编写一个openCV程序,将视频分解为帧,然后逐个比较两帧,如果两帧相同,则拒绝该帧,否则将该帧附加到输出文件中 我怎样才能做到呢 OpenCV 2.4.13 Python 2.7以下示例从连接到系统的第一个摄像头捕获帧,将每个帧与前一帧进行比较,如果不同,则将帧添加到文件中。如果您坐在摄像机前不动,如果从控制台终端窗口运行程序,您可能会看到打印的诊断“无更改”消息 有许多方法可以测量一个帧与另一个帧的不同程度。为了简单起见,我们使用了新帧和前一帧之间的平均差值(与阈值相比),逐像素

我正在尝试编写一个openCV程序,将视频分解为帧,然后逐个比较两帧,如果两帧相同,则拒绝该帧,否则将该帧附加到输出文件中

我怎样才能做到呢


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