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

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

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

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

Python

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

Q&A

解決済

1回答

761閲覧

全検出結果のうち、一部の結果だけを指定して出力する方法を教えて頂きたいです

Royce

総合スコア16

OpenCV

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

Python

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

0グッド

1クリップ

投稿2020/01/20 04:27

###実現したいこと・わからないこと
輪郭のわかっている画像中で、指定した物体だけの輪郭と面積情報の抽出を行いたいです。
現状では以下の画像のように全面にわたって物体の輪郭を検出し、輪郭描画できている状態ですが、
中央の一番大きい円形物だけの情報抽出の仕方がわかりません。
イメージ説明

ソースコードを以下に示します。
######ソースコード

Python

1import cv2 2 3#Step1.画像の読み込み('filename',0(gray scale) or 1(BGR)) 4img = cv2.imread('img31.tif') 5im_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 6#読み込んだ画像は、imgの中に[高さ, 幅, (blue, green, red)]のnumpy_arrayとして読み込まれている。 7 8#Step2.二値化の前処理(ぼかし) 9img_blur = cv2.GaussianBlur(im_gray, (5,5),0) 10 11#Step3.二値画像を取得(適応的しきい値処理)と出力 12th = cv2.adaptiveThreshold(img_blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\ 13 cv2.THRESH_BINARY,11,2) 14cv2.imwrite('Thresholded Image.png', th) 15cv2.imshow('Thresholded Image', th) 16 17#Step3.二値化した画像の白黒を反転させて出力 18th_inv = cv2.bitwise_not(th) 19cv2.imshow('hanten',th_inv) 20 21#Step4.輪郭を抽出する 22contours, hierarchy = cv2.findContours(th_inv, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 23 24#Step.5検出した輪郭内の面積および輪郭線描画の出力 25for i in range(len(contours)): 26 im_con = th.copy() 27 print('ID', i, 'Area', cv2.contourArea(contours[i])) 28 im_con = cv2.drawContours(im_con, contours, i, (190,0,0), 2) 29 cv2.imwrite('result' + str(i) + '.png', im_con)

現状では、別コードにてcv2.drawContours(im_con, contours, 20, (190,0,0), 2)の第3引数の検出された物体の番号を指定し、対処している状況です(下図)。
イメージ説明

###解決したい点
Step5.のfor文の中で、画像全面にわたって検出された輪郭内の面積表示と輪郭線描画を行っていますが、この画像に対する検出が58点もあるため、大量に保存されてしまいます。たとえば、Area=500.0以上を表示・描画・保存できるように指定するにはどのようにしたら良いでしょうか。
お力添えいただきたく存じます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ループ内の cv2.drawContours() を呼び出すより前に面積が500未満だったら continue すればよいのではないでしょうか。

for i in range(len(contours)): の次の行に以下を追加

python

1 if cv2.contourArea(contours[i]) < 500: 2 continue

投稿2020/01/20 04:38

tiitoi

総合スコア21956

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

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

Royce

2020/01/20 04:42

コメントありがとうございます。ご提案いただきましたコード追加で、無事に抽出できました!ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問