Python 使用阈值在OpenCV中写出帧

Python 使用阈值在OpenCV中写出帧,python,python-3.x,opencv,image-processing,motion-detection,Python,Python 3.x,Opencv,Image Processing,Motion Detection,我正在尝试使用阈值标准从OpenCV将帧写入视频,以指定要写入的帧 我通过比较帧间像素强度来生成运动索引,目的是自动删除运动索引小于定义阈值的视频片段(当视频中的人不移动时) 不幸的是,当我绘制运动索引时,我看到以下内容: (图1:根据帧编号绘制运动索引轨迹,用户定义的线段重叠(橙色),后续阈值绘制为水平线。-阈值定义为用户定义区域的平均值加上3倍标准偏差。) 从我的图中可以看出,高运动指数值的周期通常会下降到我的阈值以下,然后再迅速上升。目前我的代码是这样的,当我希望包含这些亚阈值帧时,它不会

我正在尝试使用阈值标准从OpenCV将帧写入视频,以指定要写入的帧

我通过比较帧间像素强度来生成运动索引,目的是自动删除运动索引小于定义阈值的视频片段(当视频中的人不移动时)

不幸的是,当我绘制运动索引时,我看到以下内容: (图1:根据帧编号绘制运动索引轨迹,用户定义的线段重叠(橙色),后续阈值绘制为水平线。-阈值定义为用户定义区域的平均值加上3倍标准偏差。)

从我的图中可以看出,高运动指数值的周期通常会下降到我的阈值以下,然后再迅速上升。目前我的代码是这样的,当我希望包含这些亚阈值帧时,它不会将它们写入文件。我想能够做的是定义图形区域,其中运动指数持续高于或低于一行中任意数量帧的阈值——即,我只想写出运动持续一段时间高于阈值的视频帧,并且不写入运动索引跟踪低于阈值的区域

目前,我的代码只对循环中的一个帧与下一个帧进行比较,以生成运动索引值列表,因此不可能将多个帧一起比较以查看是否存在一组持续的高于阈值的值。有人知道如何解决这个问题吗

我理解这可能会有点困惑-如果需要任何澄清,请让我知道

提前谢谢

import cv2
import tkinter as tk
from tkinter.filedialog import askopenfilename
import numpy as np 
import os
import matplotlib.pyplot as plt 


MIList =[]

root = tk.Tk()
root.withdraw()

selectedvideo = askopenfilename()
cap = cv2.VideoCapture(selectedvideo)
length = cap.get(cv2.CAP_PROP_FRAME_COUNT)
intlength = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
currentframenumber = cap.get(cv2.CAP_PROP_POS_FRAMES)
intcurrentframenumber = int(cap.get(cv2.CAP_PROP_POS_FRAMES))
scaling_factor = 1
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter((selectedvideo + 'motionindexed.avi'),fourcc, 60.0, (640,478), isColor=False)
with open((selectedvideo + 'threshold' + '.txt'), 'r') as readthreshold:
    threshold = float(readthreshold.readline())

def frame_diff(prev_frame, cur_frame, next_frame):
    diff_frames1 = cv2.absdiff(next_frame, cur_frame)

    diff_frames2 = cv2.absdiff(cur_frame, prev_frame)

    return cv2.bitwise_and(diff_frames1, diff_frames2)

def get_frame(cap):
    ret, frame = cap.read()
    if ret == True:
        scaling_factor = 1
        frame = cv2.resize(frame, None, fx = scaling_factor, fy = scaling_factor, interpolation = cv2.INTER_AREA)
        return cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)

if __name__ == '__main__':

    prev_frame = get_frame(cap)
    cur_frame = get_frame(cap)
    next_frame = get_frame(cap)

    while (cap.isOpened()):

        try:
            cv2.imshow("Object Movement", frame_diff(prev_frame, cur_frame, next_frame))
            prev_frame = cur_frame
            cur_frame = next_frame
            next_frame = get_frame(cap)
            differencesquared = (next_frame-cur_frame)**2
            interframedifference = np.sum(differencesquared)
            MIList.append(interframedifference)
            print(interframedifference)
            if interframedifference > threshold:
                out.write(cur_frame)

            key = cv2.waitKey(1)
            if key == ord('q'):
                break
        except:
            break

cap.release()
cv2.destroyAllWindows()