2017-03-20 4 views
0

ピクセル強度の差があらかじめ定義されたしきい値より高い場合は、VideoFlagリストに値を書き込もうとしています。しかし出力では、私の出力 'flag.txt'ファイルは空であり、私はなぜそれがわかりません。誰かが私のコードが間違っていることをどのように知っていますか?プログラムはwhileループからのリストに書き込まれませんか?

ありがとうございます!

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

私は 'with open as'ステートメントを使用しているため、閉じる必要はありません。 – KittenMittons

+0

はい、正しいです。 –

+0

'print(VideoFlag)'は何かを印刷しますか? Windowsマネージャーでダブルクリックして実行している場合は、思った以外のディレクトリにファイルを書き込んでいる可能性があります。 'print(os.path.abspath(selectedvideo + 'flag' + '.txt'))'はあなたに実ファイルを表示します。 – tdelaney

答えて

1

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

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

を交換しても問題が解決しなければなりません。

+0

これがどのように役立つか分かりません。プログラムは、計算を実行した後にファイルを1回書き込みます。 appendに切り替えることで、ユーザーは以前の実行からの値を上書きしませんが、それは問題を解決するのに役立たず、ただ古いデータを残します。 – tdelaney

+0

奇妙なことに、私もそれを修正したと思っていましたが、問題はまだ残っています - 私のフラグテキストファイルの出力が生成されておらず、出力ビデオも生成していません.. – KittenMittons

+0

@KittenMittons 'VideoFlag' ? –

0

私は自分の問題を解決したと思っています。何らかの理由で、私の追加メソッドの型が原因で実行されていなかったのですが、私の整数の1つを文字列に変換するのを忘れてしまいました。それを再加工し、私はそれが私の問題を解決したと思う!入力仲間のための乾杯!

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() 
関連する問題