taizu61zx
@taizu61zx (は たい)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

OpenCVでの連続した画像の処理でメモリ使用量が著しく増加する

解決したいこと

Python、CV2で画像に図形を描画するなどの処理を施してから保存するプログラムを作りました。連続して処理を行い、大体100枚程度の画像を連続で処理するようにつくりました。しかし、これを実行していると、メモリの使用量が大幅に増加してしまい、処理速度の著しい低下がみられました。
どなたか解決方法を教えてほしいです。

発生している問題・エラー

エラー等はありません。

該当するソースコード

import cv2

n = 0

while True :
     try:
          imgpath = str(n) + ".jpg"
          img = cv2.imread(str(imgpath) , cv2.IMREAD_GRAYSCALE)
          result = cv2.imwrite(str(imgpath) ,img)
          n += 1
     except Exception as e :
          print(e)
          break

自分で試したこと

メモリの使用量が異常に増えているということは、処理した画像がメモリに残っているからではないかと考えたりもしたのですが原因が全く分かりません。
どなたか解決方法を教えて下さい。よろしくお願いします。

0

1Answer

https://qiita.com/ryuoujisinta/items/4a26782bb9cfd59e4346
が参考になります。
子プロセスに任せるとうまくメモリが解放されるかもしれないです。

import cv2


def do_process(n):
    try:
        imgpath = str(n) + ".jpg"
        img = cv2.imread(str(imgpath) , cv2.IMREAD_GRAYSCALE)
        result = cv2.imwrite(str(imgpath) ,img)
    except Exception as e :
        print(e)
        return False
    return True


n = 0
while True:
    if do_process(n):
        n += 1
    else:
        break

これでどうでしょうか。

補足ですが、tryとexcept使わないでglobを使うと良いと思いました。使い方は今いるパスに処理したいJPG画像がある場合は、

import glob
import cv2


def do_process(file_name):
    img = cv2.imread(file_name, cv2.IMREAD_GRAYSCALE)
    result = cv2.imwrite(file_name, img)


file_names = glob.glob("*.jpg")
for file_name in file_names:
    do_process(file_name)

こんな感じで使います。

0Like

Your answer might help someone💌