2016-12-14 15 views
1

私はpython2.7とopencvでラズベリーパイにビデオファイルを保存しようとしています。以下に示すコードは、いくつかのビデオファイル(サイズ16-18 Mb)をUSBに一貫して保存しますが、最初の数ファイルの後にはファイルサイズが6 kbに低下し、開かないため空であるように見えます。OpenCVビデオライターはメモリリークのため空白のファイルを書き込みますか?

保存中にpythonによるメモリ使用量を監視するためにタスクマネージャを開いて、ビデオファイルが空白になるのを約200MBまでRSSメモリが絶えず増加することに気付きました。

これはメモリリークの確実な指標ですか、それとも他のテストを実行する必要がありますか?

変数を正しくリリースしていない以下のコードに何か問題がありますか?

import cv2 
import numpy as np 
import datetime 

dispWidth = 640 
dispHeight = 480 
FPS = 6 

SetupNewVideoFile = True # state variable 
VidCaptureDurationMinutes = 3 


filepath = '/media/pi/9CEE-5383/Videos/' 

i = 1 # counter for the video file names 

fourcc = cv2.cv.CV_FOURCC('X','V','I','D') 

while True: 
    # timer section that ends running file saves and triggers a new file save 
    Now = datetime.datetime.now() # refresh current time 
    delta = Now - VidCaptureStartTime 
    print('delta: ',delta.seconds,delta.days) 
    if ((delta.seconds/60) >= VidCaptureDurationMinutes) and delta.days >= 0: 
     print('delta: ',delta.seconds,delta.days) 
     SetupNewVideoFile = True 
     Vidoutput.release() 
     cap.release() 

    # setting up new file saves 
    if SetupNewVideoFile: 
     SetupNewVideoFile = False 

     title = "Video_"+str(i)+".avi" 
     i += 1 
     fullpath = filepath + title 
     print(fullpath) 

     Vidoutput = cv2.VideoWriter(fullpath, fourcc, FPS,(dispWidth,dispHeight)) 
     VidCaptureStartTime = datetime.datetime.now() # updating video start time 

     cap = cv2.VideoCapture(-1) # start video capture 




    ret, frame = cap.read() 
    if ret: # display and save if a frame was successfully read 
     cv2.imshow('webcam',frame) 
     Vidoutput.write(frame) # save the frames 

    key = cv2.waitKey(1) & 0xFF 
    if key == ord('q'): # quits program 
     break 


# clean up 
cap.release() 
Vidoutput.release() 
cv2.destroyAllWindows() 
cv2.waitKey(1) # these seem to be needed to flush the cv actions 
cv2.waitKey(1) 
cv2.waitKey(1) 
cv2.waitKey(1) 

答えて

0

pymplerモジュールの機能とチュートリアルからいくつかのより多くのトラブルシューティングとヘルプ(https://pythonhosted.org/Pympler/muppy.html)した後、私の問題はまだメモリリークのように見えたが、私は特定のエラーを解決することができませんでした。

この他のS.O.ポスト(Releasing memory in Python)は、Pythonのバージョン3.3で行われたメモリ管理の改善について述べました。

"小さなオブジェクトアロケータはヒープの代わりに匿名メモリマップを使用するように切り替えられました。

私はPython 3.3に切り替えました。コードは有効なビデオファイルを保存していました。 これは空白ファイルがなぜ発生したのかの答えではありませんが、少なくとも解決策です。

関連する問題