質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2207閲覧

cv2.findContoursをfor文で回すと処理が止まってしまいます

ysk_snn

総合スコア21

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/13 07:37

編集2020/05/14 09:25

前提・実現したいこと

複数の画像に対してcv2.findContoursをかけたいのですが、
for文の処理の途中で止まってしまいます。
解決方法と、できればなぜ止まってしまうのか知りたいです。

該当のソースコード

python3

1import numpy as np 2import math 3import matplotlib.pyplot as plt 4from PIL import Image 5 6import glob 7import os 8import cv2 9import scipy 10import scipy.stats as stats 11from scipy.stats import kurtosis 12import pandas as pd 13import re 14import openpyxl 15from openpyxl.drawing.image import Image as xlImage 16import shutil 17 18import time 19from tqdm import tqdm 20import holoviews as hv 21from holoviews import opts 22hv.extension('bokeh') 23 24path = r"C:\Users\ysk\OneDrive\sample_im_reference_copy" 25new_dir = r'\area_std' 26 27if os.path.exists(path + new_dir) == 1: 28 shutil.rmtree(path + new_dir) 29else: 30 pass 31 32os.mkdir(path + new_dir) 33os.mkdir(path + new_dir + r'\histgram') 34 35def make_im_list(path): 36 tif_list = glob.glob(path + "/*.tif") 37 tif_list.sort(reverse=False) 38 return tif_list 39 40tif_list = make_im_list(path) 41 42def make_area_list(contour): 43 area_list = [] 44 for cnt in contours: 45 area = cv2.contourArea(cnt) 46 area_list.append(area) 47 return area_list 48 49mean_list = [] 50std_list = [] 51 52for i in tqdm(tif_list): 53 print(i) 54 im = np.array(Image.open(i)) 55 im_inv = 255 - im 56 ret,im_th = cv2.threshold(im_inv, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) 57 contours, hierarchy = cv2.findContours(im_th, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) 58 area_list = make_area_list(contours) 59 area_array = np.array(area_list) 60 mean_list.append(area_array.mean()) 61 std_list.append(area_array.std())

試したこと

###試したこと①
tqdmで処理状況を確認すると、33%程度進むと処理が一度停止し、
しばらく待つと処理が再スタートするのですが、67%程度で再度処理が止まり、そこから動くことはありませんでした。
33%、67%まで処理が進んだ時に処理をしている画像を確認しましたが、ほかの画像と特に違う点は見つかりません。

###試したこと②
contours, hierarchy = cv2.findContours(im_th, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
によって発生するcontours, hierarchyがメモリを圧迫している?かもしれないと考えて、
以下のように contours = []hierarchy = [] を付け足し、毎回 contours, hierarchy を空っぽにしようとしましたが、特に変化なく処理が止まってしまいました。

###試したこと③
33%、67%の際に処理していた画像のみに処理をかけると止まってしまったので、その画像に問題があるようです。
問題の画像と、そうでない画像のプロパティを確認しても特に違いがありませんでした。
フォトのアプリで表示しても見た目に大きな違いもありません。

補足情報(FW/ツールのバージョンなど)

python 3.6.9
opencv 4.1.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/05/13 08:19

エラーは何も発生していないのですね?
ysk_snn

2020/05/13 09:03

しておりません 砂時計マークのままです 33%まではするする進んで、一度そこで1minくらい止まったのち、 67%までするする進んで、そこから動かなくなります
meg_

2020/05/13 09:32

止まる画像のみで同じ処理をした場合も止まりますか?
ysk_snn

2020/05/13 09:45

止まりました! 33%の時に処理をしていた画像では、同じように短時間止まって、 67%の時に処理をしていた画像では、同じようにそこから処理が進まなくなりました。 ただ、どちらの画像も同じ処理をかけているほかの画像との差が分かりません... 追加情報として、 今回処理をかけているのは一枚あたり64MB程度のtifファイルで、全部で36枚あります。 すべての画像は同じ撮影機器で同じ条件で撮影したもので、容量も全画像同じです。 実際にフォトとして開いてみてもほかの画像と見た目は同じようです。
meg_

2020/05/13 10:16

理由は分かりませんがデータ(画像)に原因があったようですね。
ysk_snn

2020/05/14 09:26

試したことに追記したのですが、プロパティを確認しても特に違いがありませんでした。 エラーが発生せずにcv2.findContoursの処理が止まる理由で、考えられるものはありませんでしょうか。
meg_

2020/05/14 09:29

一度処理が終わるまでその画像のみ実行してみてはどうでしょうか?実行結果を見たら何か分かるかもしれません。 空いてるサーバーとかないですか?
ysk_snn

2020/05/20 08:11 編集

解決しました! ありがとうございます。 画像の中にごく小さな面積がたくさんあったことで、処理に時間がかかっていただけのようでした... 丁寧に問題を分析してくださってありがとうございました。 あと一点問題があるのですが、質問への追記・修正の依頼からだとベストアンサーを選べないようです... 申し訳ないのですが、回答のほうにもコメントいただけませんでしょうか?
meg_

2020/05/20 09:14

結果としてコードにもデータにも問題はなかったとのことですので、自己解決にしていただいて結構です。 解決されてなによりです。
ysk_snn

2020/06/02 08:30

ご返信遅くなりまして申し訳ございません。 なんとお礼を言ってよいかわかりません。 ありがとうございました。
guest

回答1

0

自己解決

処理が終わらない画像に対する処理を、処理が止まるまでしばらく回したところ、
contoursの個数が他の画像と比べて飛びぬけて多かった。
ぼかし処理等をかけることで解決した。

投稿2020/06/02 08:34

ysk_snn

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問