🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

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

Q&A

解決済

1回答

4890閲覧

opencv フォルダ内の画像の一括処理

reonald

総合スコア32

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

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

0グッド

0クリップ

投稿2019/11/18 08:35

編集2019/11/19 04:31

現在のコードとして,

from pathlib import Path import cv2 import numpy as np import shutil import matplotlib.pyplot as plt import glob files = glob.glob("./3/./1.2/*") for f in files: img = cv2.imread(f) cut = img[460:1270, 130:940] z=1*810/1478 gray = cv2.cvtColor(cut, cv2.COLOR_BGR2GRAY) ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) binary = cv2.dilate(binary, kernel) contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) rects = [] for cnt in contours: if cv2.contourArea(cnt) < 4000: continue rect = cv2.minAreaRect(cnt) rects.append(rect) def crop(cut, rect): center, size, angle = rect center = tuple(map(int, center)) size = tuple(map(int, size)) j, k = cut.shape[:2] M = cv2.getRotationMatrix2D(center, angle, 1) rotated = cv2.warpAffine(cut, M, (k, j)) im2 = cv2.getRectSubPix(rotated, size, center) return im2 for i, rect in enumerate(rects): im2 = crop(cut, rect) hsv = cv2.cvtColor(im2, cv2.COLOR_BGR2HSV) h, s, v = cv2.split(hsv) mean = v[v < 230].mean() if mean < 170: save_path = './phyto/debug_%d.jpg' % i print(save_path) cv2.imwrite(save_path, im2) else : y, x = im2.shape[:2] a=max(y,x) b=z*a/810 print('','',y,x,a,'大きさ:{0}'.format(b)) if a < 100: continue elif 100 < a < 250: save_path = './pu1/debug_%d.jpg' % i print(save_path) cv2.imwrite(save_path, im2) elif 250 < a < 400: save_path = './pu2/debug_%d.jpg' % i print(save_path) cv2.imwrite(save_path, im2) elif 400 < a : save_path = './pu3/debug_%d.jpg' % i print(save_path) cv2.imwrite(save_path, im2) コード

となっているのですが,実行すると,
133 149 149 大きさ:0.10081190798376183
./pu1/debug_0.jpg
111 95 111 大きさ:0.07510148849797023
./pu1/debug_0.jpg
./phyto/debug_1.jpg
127 59 127 大きさ:0.08592692828146144
./pu1/debug_2.jpg
809 598 809 大きさ:0.547361299052774
./pu3/debug_3.jpg
118 202 202 大きさ:0.13667117726657646
./pu1/debug_0.jpg
93 104 104 大きさ:0.07036535859269283
./pu1/debug_0.jpg
となり,
保存するときにdebug0.jpgなどが上書きされてしまっております。
おそらく,初めのforの処理をするときに,毎回debug_0.jpgという名前で保存するプログラムになってしまっていると思うのですが,
初めのforのでn番目の画像処理をするときにdebug-n_0.jpgなどの名前で保存することはできないでしょうか。
コード修正宜しくお願いします。

pythonのversionは3.7.3で,
opencvのversionは4.1.1です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

OpenCVは関係なく、Pythonだけに閉じた話かと思われます。

Python

1import os 2 3l = os.listdir('./p1/1/') # => ['S__433733663.jpg', ...] 4for path in l: 5 img = cv2.imread(path) 6 ...

追記:

出力ファイルは、入力ファイルの数×rectの数分作られます。
ですので、出力ファイルのインデックスが足りなくて、以下のようにする必要があります。

Python

1for i, f in enumerate(files): 2 # 中略 3 for j, rect in enumerate(rects): 4 # 中略 5 save_path = './pu1/debug_%d_%d.jpg' % (i, j) 6 # 以下略

投稿2019/11/18 08:42

編集2019/11/19 04:40
kazto

総合スコア7196

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

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

reonald

2019/11/19 01:47

冒頭部分を, l = os.listdir('./p1/1/') for path in l: img = cv2.imread(path) cut = img[460:1270, 130:940] のように書き換えたのですがうまく回りません。
kazto

2019/11/19 02:06

うまく回らない、とは、具体的にどのようなエラーが出ていますか?
reonald

2019/11/19 02:18

現在のコードが, from pathlib import Path import cv2 import numpy as np import shutil import matplotlib.pyplot as plt import glob files = glob.glob("./3/./1.2/*") for f in files: img = cv2.imread(f) cut = img[460:1270, 130:940] z=1*810/1478 gray = cv2.cvtColor(cut, cv2.COLOR_BGR2GRAY) ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) binary = cv2.dilate(binary, kernel) contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) rects = [] for cnt in contours: if cv2.contourArea(cnt) < 4000: continue rect = cv2.minAreaRect(cnt) rects.append(rect) def crop(cut, rect): center, size, angle = rect center = tuple(map(int, center)) size = tuple(map(int, size)) j, k = cut.shape[:2] M = cv2.getRotationMatrix2D(center, angle, 1) rotated = cv2.warpAffine(cut, M, (k, j)) im2 = cv2.getRectSubPix(rotated, size, center) return im2 for i, rect in enumerate(rects): im2 = crop(cut, rect) hsv = cv2.cvtColor(im2, cv2.COLOR_BGR2HSV) h, s, v = cv2.split(hsv) mean = v[v < 230].mean() if mean < 170: cv2.imwrite('./phyto/debug_%d.jpg' % i, im2) else : y, x = im2.shape[:2] a=max(y,x) b=z*a/810 print('','',y,x,a,'大きさ:{0}'.format(b)) if a < 100: continue elif 100 < a < 250: cv2.imwrite('./pu1/debug_%d.jpg' % i, im2) elif 250 < a < 400: cv2.imwrite('./pu2/debug_%d.jpg' % i, im2) elif 400 < a : cv2.imwrite('./pu3/debug_%d.jpg' % i, im2) なのですが,これだと保存するときにdebug_0.jpgが被ってしまい,上書きされてしまいます。 どのようにすればよいでしょうか。
kazto

2019/11/19 02:45

Pythonコードはインデントが重要です。コメント欄ではインデントが効きませんので、コードは質問を編集する形で記載をお願いします。
reonald

2019/11/19 03:44

修正しました。
kazto

2019/11/19 04:18

ありがとうございます。それにしても、ぱっと見 i が重複するようなことは無さそうなコードになっていますし、何が起きているのかちょっとわかりませんね。。。 ``` save_path = './pu1/debug_%d.jpg' % i print(save_path) cv2.imwrite(save_path, im2) ``` のように変えて、パス名を表示させてどのように重複しているか調べてみてはいかがでしょうか。
reonald

2019/11/19 04:32

コード修正,質問内容,実行結果などを変更しました。 再度確認してもらえると有難いです。
kazto

2019/11/19 04:35

あー、わかりました。i はglobした入力ファイルごとにリセットされますね。
reonald

2019/11/19 04:49

まわりました! 本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問