このスクリプトは、ウェブカメラから写真を撮り、1 時間ごとに保存します。
import cv
import time
def f():
camera = cv.CreateCameraCapture(0)
time_ = time.strftime("%Y-%m-%d_%H:%M:%S")
frame = cv.QueryFrame(camera)
cv.SaveImage("%s.png" % time_, frame)
while True:
f()
time.sleep(3600)
スクリプトの実行中に Web カメラにアクセスしたい場合があるため、毎回キャプチャ キャプチャを作成しています。しかし、それは問題ではないようです。QueryFrame はメモリを増やし続けます。関数が終了した後は、ガベージ コレクションは行われません。検索すると、OpenCV Python QueryFrame 関数がメモリをリークしていることがわかり、次の行を試しました。
def f():
global n
camera = cv.CreateCameraCapture(0)
time_ = time.strftime("%Y-%m-%d_%H:%M:%S")
frame = cv.QueryFrame(camera)
if n == 1:
image = cv.CreateImageHeader(cv.GetSize(frame), frame.depth,
frame.channels)
n = 2
cv.SetData(frame, image)
cv.SaveImage("%s.png" % time_, image)
しかし、次のエラーが発生します。
Traceback (most recent call last):
File "log_webcam.py", line 20, in <module>
f()
File "log_webcam.py", line 17, in f
cv.SaveImage("%s.png" % time_, image)
TypeError: IplImage argument 'image' has no data
編集: ubuntu リポジトリの python-opencv 2.3.1-7 を使用しています。