回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>当像素强度差高于预定义阈值时,我尝试将值写入VideoFlag列表。在输出上但是我的输出'标志.txt“文件是空的,我不知道为什么。有人知道我的代码是怎么错的吗?你知道吗</p>
<p>谢谢!你知道吗</p>
<pre><code>import cv2
import tkinter as tk
from tkinter.filedialog import askopenfilename
import numpy as np
import os
import matplotlib.pyplot as plt
MIList =[]
VideoFlag=[]
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)
def moving_average(MIList, n=30) :
ret = np.cumsum(MIList, dtype=float)
ret[n:] = ret[n:] - ret[:-n]
return ret[n - 1:] / n
def main():
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())
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)
VideoFlag.append(str(intcurrentframenumber + '|' + 1))
print(VideoFlag)
elif interframedifference < threshold:
VideoFlag.append(str(intcurrentframenumber + '|' + 0))
print(VideoFlag)
key = cv2.waitKey(1)
if key == ord('q'):
break
except:
break
with open((selectedvideo + 'flag' + '.txt'), 'w') as f:
for item in VideoFlag:
f.write(str(item))
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
# this is called if this code was not imported ... ie it was directly run
# if this is called, that means there is no GUI already running, so we need to create a root
root = tk.Tk()
root.withdraw()
main()
</code></pre>