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

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

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

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

OpenCV

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

Python

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

Q&A

解決済

3回答

3189閲覧

python,opencv 散らばった輪郭の内側の面積の総和を求める

kazu777

総合スコア2

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

OpenCV

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

Python

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

0グッド

0クリップ

投稿2021/07/06 00:40

前提・実現したいこと

画像内の散らばった輪郭の面積の総和を出したいのですがやり方がよくわからず止まっています
適切なやり方・コードを教えていただけると幸いです

発生している問題・エラーメッセージ

error Traceback (most recent call last) <ipython-input-35-23e0f86dac3f> in <module> 23 img_contour = cv2.drawContours(img, contours, -1, (0, 255, 0),5) 24 ---> 25 area = cv2.contourArea(img_contour) 26 27 #画像出力 error: OpenCV(4.0.1) C:\ci\opencv-suite_1573470242804\work\modules\imgproc\src\shapedescr.cpp:272: error: (-215:Assertion failed) npoints >= 0 && (depth == CV_32F || depth == CV_32S) in function 'cv::contourArea'

該当のソースコード

python

1#白黒画像に変換 2import cv2 3import numpy as np 4#画像読み込み(日本語は使用不可)(目的の画像に対してshift +右クリック→ソースのコピー) 5img = cv2.imread(r"C:\Users\2104101\Desktop\dog.png") 6 7#ネガポジ反転 8rimg = cv2.bitwise_not(img) 9 10#グレイスケール化 11gray = cv2.cvtColor(rimg, cv2.COLOR_BGR2GRAY) 12 13#2値化 14ret,th = cv2.threshold(gray,145,255,cv2.THRESH_BINARY) 15 16 17 18#輪郭検出 19contours, hierarchy = cv2.findContours(th, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 20 21#輪郭描画 22img_contour = cv2.drawContours(img, contours, -1, (0, 255, 0),5) 23 24area = cv2.contourArea(img_contour) 25 26#画像出力 27cv2.imwrite('area'+r'C:\Users\2104101\Desktop\a(9).png', img_contour)

試したこと

ここに問題に対して試したことを記載してください。

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

python3系 anaconda opencvを使用

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

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

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

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

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

fana

2021/07/06 03:15

現在までの回答やコメントを見るに この質問で解決すべき課題というのが何なのか: > 発生している問題・エラーメッセージ のエラーを解消するという話なのか,それとも, > 画像内の散らばった輪郭の面積の総和を出したい という処理さえできれば現状のコードとエラーはどうでもいい,という話なのか……? そのあたりを明確にされた方が良いように見受けます.
kazu777

2021/07/06 05:19

質問の目的を明確に示していなくて、すいませんでした 目的は画像内の散らばった輪郭の面積の総和を出したいというものです エラーやコードは特に重要ではないです
guest

回答3

0

ベストアンサー

fillConvexPolyを使いましょう。

python

1import cv2 2import numpy as np 3img = cv2.imread(r"cont_test.png") 4 5plt.imshow(img) 6plt.show()

実行結果
イメージ説明

python

1#ネガポジ反転 2rimg = cv2.bitwise_not(img) 3 4#グレイスケール化 5gray = cv2.cvtColor(rimg, cv2.COLOR_BGR2GRAY) 6 7#2値化 8ret,th = cv2.threshold(gray,145,255,cv2.THRESH_BINARY) 9 10#輪郭検出 11contours, hierarchy = cv2.findContours(th, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 12 13mask = np.zeros_like(gray) 14for c in contours: 15 cv2.fillConvexPoly(mask, c, 255) 16 17plt.imshow(mask,cmap = 'gray') 18plt.show()

実行結果
イメージ説明]

白い画素の数は以下です。

python

1>>> print(np.count_nonzero(mask==255)) 2156960

投稿2021/07/06 01:57

ppaul

総合スコア24668

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

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

fana

2021/07/06 02:11

> fillConvexPolyを使いましょう 何故ですか? (既存回答やそのコメントで出ている話と比較してどのような利点がありますか?)
kazu777

2021/07/06 02:30

回答ありがとうございます さらに質問となるのですが... 例えば,最初の画像の黄土色の丸の中に白い丸があり,その白い丸の部分の面積も図形の面積として扱いたいときにはどういった処理をすればよいのでしょうか? もしよければ,回答をお願いします
ppaul

2021/07/06 06:48

fanaさん、確かにずれていますね。
ppaul

2021/07/06 06:52

kazu777さん、 実は、最初に作ったテスト画像はまさに「黄土色の丸の中に白い丸」だったのです。 これでやると白い部分の丸も面積に入ってしまうので、それを取り除く方法を試行錯誤して失敗したのでこの画像を載せました。 言い換えると、この処理をやれば、その白い丸の部分の面積も図形の面積として計算されます。 やってみてください。
fana

2021/07/06 08:53

RETR_EXTERNAL を使ってるなら,単に contourArea で面積を求めれば内側の穴も含めた面積が得られませんかね.
guest

0

cv2.contourArea(img_contour)

引数がおかしい.
contourArea は contourの面積を求めるのだから,引数は contour のデータであるべき.
「何かてきとーに描画してみた画像」ではない.

投稿2021/07/06 01:04

fana

総合スコア11951

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

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

fana

2021/07/06 01:54

findContours は teretail で phtyon で OpenCV な方々に何故か大人気(?)なので, "contourArea" で検索すれば python で contourArea を使っている例は複数見つかるかと.
kazu777

2021/07/06 02:34

コメントありがとうございます 今一度,調べてみます
guest

0

面積は総画素数ですよね?
2値化しているのなら画素をひとつひとつ見ていき、1の画素を数えればよいのではないでしょうか。

投稿2021/07/06 00:59

p19ljk

総合スコア146

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

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

fana

2021/07/06 01:08

話はわかる(countNonzeroとか使えば一発で終了するようなことかもしれない)けど, おそらくこの質問での困りごとというのは > 発生している問題・エラーメッセージ のところだと思うので,そこにも触れてあげた方が良いかも感,みたいな.
p19ljk

2021/07/06 01:09

確かにそうでしたね。 失礼しました。
fana

2021/07/06 01:25

(わざわざcontourがどうのとかいう手段を用いているのは,後々「ただしサイズが○○なやつとか形が××のやつは除外して集計したい」みたいな話の予定があるようにも推測できるので)
kazu777

2021/07/06 01:28

質問の仕方が悪くすいません 確かに,countNonZeroで処理すればいいのですが,散らばった輪郭の検出を行った後に,その輪郭から面積を行いたいため質問しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問