程序没有从while循环写入列表?

2024-09-30 18:21:56 发布

您现在位置:Python中文网/ 问答频道 /正文

当像素强度差高于预定义阈值时,我尝试将值写入VideoFlag列表。在输出上但是我的输出'标志.txt“文件是空的,我不知道为什么。有人知道我的代码是怎么错的吗?你知道吗

谢谢!你知道吗

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()

Tags: importgetifasdiffrootcv2frame
2条回答

我想我已经解决了我的问题-不管是什么原因,它没有运行由于我的类型在我的append方法-我忘了把我的一个整数转换成一个字符串,我想,我已经修改了它,我想这解决了我的问题!为大家干杯!你知道吗

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

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 main():

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

    MIList = []
    VideoFlag = []
    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' + '\n' ))


            elif interframedifference < threshold:
                VideoFlag.append((str(intcurrentframenumber) + ' ' + '|' + ' ' + '0' + ' \n'))



            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) + '\n'))
        print(VideoFlag)


    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()

更换

with open((selectedvideo + 'flag' + '.txt'), 'w') as f:
    for item in VideoFlag:
        f.write(str(item))

# Note that you need to append('a') data to the file instead of writing('w') to it for each iteration. 
# The last line will be empty string and that is what contains finally.
with open((selectedvideo + 'flag' + '.txt'), 'a') as f: 
    for item in VideoFlag:
        f.write(str(item))

解决问题。你知道吗

相关问题 更多 >