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

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

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

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

Python

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

Q&A

解決済

2回答

1023閲覧

OpenCVで特定の色のオブジェクト個数の計算方法について

DeepRoastBeans

総合スコア79

OpenCV

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

Python

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

0グッド

0クリップ

投稿2021/12/26 08:22

画像の中から赤い色のオブジェクトの個数を抽出したいですが、OpenCVのfindContoursを使うと想定より多い数字になってしまい上手くいかないです。

試したこと

画像を用意します
イメージ説明

cv2を使いRGBで指定した範囲の色を抽出します。
イメージ説明

cv2でこの画像をgrayscaleにしてぼかします。
イメージ説明

findContours関数でぼかした領域の枠線を抽出しましたが、114になってしまいます。

python

1import cv2 2 3image = cv2.imread("out/blur.jpg") 4 5contours, hierarchy = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 6print("The number of particle is :", len(contours))

$ python3 count.py
The number of particle is : 114

個数を上手く抽出するにはどうしたら良いでしょうか?

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

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

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

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

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

fana

2021/12/27 01:08

理想の検出結果とはいくつになるべきなのですか?
guest

回答2

0

ベストアンサー

参考までに teratail でよく見る処理を提示画像に対してやってみた結果を示しておく.
(Python使えない人なのでC++ですが)

C++

1int main() 2{ 3 //Load Image 4 cv::Mat Src = cv::imread( "RedTgts.jpg" ); 5 if( Src.empty() )return 0; 6 cv::imshow( "Src", Src ); 7 8 //てきとーにinRangeで「赤い部分Mask」をつくる 9 cv::Mat Mask; 10 { 11 cv::Mat HSV; 12 cv::cvtColor( Src, HSV, cv::COLOR_BGR2HSV ); 13 14 const unsigned char S_min = 128; 15 const unsigned char V_min = 64; 16 cv::inRange( HSV, cv::Scalar(345/2,S_min,V_min), cv::Scalar(360/2,255,255), Mask ); 17 cv::Mat Mask2; 18 cv::inRange( HSV, cv::Scalar(0,S_min,V_min), cv::Scalar(15/2,255,255), Mask2 ); 19 cv::bitwise_or( Mask, Mask2, Mask ); 20 21 cv::imshow( "Mask", Mask ); 22 } 23 {//モルフォロジでゴミの除去 24 cv::erode( Mask, Mask, cv::Mat() ); 25 cv::dilate( Mask, Mask, cv::Mat(), cv::Point(-1,-1), 2 ); 26 cv::erode( Mask, Mask, cv::Mat() ); 27 cv::imshow( "Morph", Mask ); 28 } 29 {//findContours 30 std::vector< std::vector<cv::Point> > Conts; 31 cv::findContours( Mask, Conts, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE ); 32 33 //ある程度の面積を持つcontourの個数を数える 34 Src *= 0.4; //※ここでは検出結果をSrcに描画することにする 35 int N = 0; //個数カウンタ 36 const double AreaThresh = 100; //面積閾値 37 for( int i=0; i<Conts.size(); ++i ) 38 { 39 if( cv::contourArea( Conts[i] ) >= AreaThresh ) 40 { 41 ++N; 42 cv::drawContours( Src, Conts, i, cv::Scalar(0,0,255), 2 ); //見つけたものを描画してみる 43 } 44 } 45 std::cout << N << " Red Targets Found." << std::endl; 46 cv::imshow( "Result", Src ); 47 } 48 49 // 50 if( cv::waitKey() == 's' )cv::imwrite( "Result.png", Src ); 51 return 0; 52}

各種閾値等をこの画像に特化して調整して良いならば,こんな感じの結果が作れるね(検出個数=6).
イメージ説明

投稿2021/12/27 01:49

fana

総合スコア11708

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

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

fana

2021/12/27 01:56

質問者の処理には「ぼかす」というステップがあるようだが,ここでは取り入れていない. ぼかしには 検出すべき部分が複数の小領域に分かれてしまったときにそれらを統合する効果があるであろうが, 検出したくない部分にも同様の効果を生じる(細かなゴミが統合された大きな領域に育ってしまう可能性がある)から,先にゴミを除去することを考えた方がよいかと. このコードでは細かなゴミを除去する処理としてモルフォロジを用いている. で,領域統合方向の処理も(ぼかしではなく)モルフォロジでやっている.
fana

2021/12/27 01:57

(松ぼっくりを「赤いオブジェクト」とするのか否かは不明だが,ここでは検出しない方向の処理パラメタにしている.)
DeepRoastBeans

2021/12/27 02:09

大変素晴らしいです。参考にさせていただきます。 ありがとうございます!
DeepRoastBeans

2021/12/27 04:37

cv2.bitwise_notで反転して、cv2.erode, cv2.dilateを試してみたところ、やりたかったことができました。
guest

0

114個というのがそれぞれ何なのか(どこなのか)を確認する作業から始めてください.

例えば,あなたが「1個」だと思っている個所に複数の細かい検出結果が生じているのであれば
「うまくくっつける」ための算段を考えればよいでしょう.
(それが「ぼかし」であったのならば,ぼかしを強くしたらどうなるのか,等)

#途中処理状態の絵が非常に見難いです.処理状態の可視化用途であれば「見やすい」表示方法を考えてはどうでしょうか? ご自身でも状況把握しやすくなるのでは?

投稿2021/12/27 01:07

fana

総合スコア11708

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問