前提・実現したいこと
python+opnencvでネットワークカメラから白色の物体をリアルタイム検知するシステムを作っています。
輪郭を検出する際は毎フレームcv2.findContoursをループ実行しています
エラーはなく機能を実装できたのですが長時間動かすシステムの為、tracemallocでメモリークの調査をしていたところ以下の問題点を見つけました。
cv2.findContoursがメモリを確保し続け、メモリの容量が大きくなっていきます。
また下記の該当コードは本コードではなく同じ現象を再現する為の試験用コードです。
発生している問題・エラーメッセージ
cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)のところでメモリを確保し続ける。 tracemallocの出力 C:/PATH/video.py:29: size=68.8 KiB (+68.8 KiB), count=154 (+154), average=457 B ↑ ↑ ↑ cv2.findContours 増え続ける 増え続ける を書いた行
該当のソースコード
python
1import numpy as np 2import cv2 3import tracemalloc 4import gc 5from statistics import mean 6 7tracemalloc.start() 8 9url = "rtsp://user:pass@ip_address/MediaInput/h264/stream_1" 10cap = cv2.VideoCapture(url) 11cv2.namedWindow('frame', cv2.WINDOW_NORMAL) 12 13snap1 = tracemalloc.take_snapshot() 14 15i = 0 16 17while (True): 18 # フレーム読み込み 19 ret, frame = cap.read() 20 # フィルター 21 filter_image = cv2.GaussianBlur(frame, (5, 5), 0) 22 # グレースケール化 23 gray = cv2.cvtColor(filter_image, cv2.COLOR_BGR2GRAY) 24 # 2値化 25 ret2, binary_image = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) 26 # モルフォロジー変換 27 morphology_image = cv2.morphologyEx(binary_image, cv2.MORPH_OPEN, np.ones((15, 15), np.uint8)) 28 # 輪郭検出*ここでメモリが確保され続ける? 29 cv2.findContours(morphology_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 30 31 # 映像出力 32 cv2.imshow('frame', filter_image) 33 if cv2.waitKey(1) & 0xFF == 27: 34 break 35 36 if cv2.waitKey(1) & 0xFF == ord('c'): 37 cv2.moveWindow('frame', 100, 100) 38 39 i += 1 40 41 #100フレームに1回スナップショットと差分比較 42 if i == 100: 43 i = 0 44 snap2 = tracemalloc.take_snapshot() 45 top_stats = snap2.compare_to(snap1, 'lineno') 46 print("[ Top 10 differences ]") 47 for stat in top_stats[:10]: 48 print(stat) 49 50 gc.collect() #効果なし 51 52cap.release() 53cv2.destroyAllWindows()
試したこと
輪郭を出すときはcv2.findContours()を変数に入れると思いますが、その変数を[del]したあと手動でガベージをしましたが効果なし。
どうやらcv2.findContours()をループ実行するだけでメモリが確保され続けるようです
補足情報(FW/ツールのバージョンなど)
os: windows10
python: 3.7.5
ライブラリ
numpy: 1.19.0
opnencv-contrib-python: 4.2.0.34
あなたの回答
tips
プレビュー