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

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

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

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

Python

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

Q&A

解決済

2回答

2043閲覧

Opencv 円 中心 色

lebdom_11

総合スコア6

OpenCV

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

Python

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

0グッド

0クリップ

投稿2020/11/04 03:50

python,Opencvを用いてHough変換により円の中心座標を取得しました。
その中心の色を調べたいのですが、

color = img[centers]

IndexError: arrays used as indices must be of integer (or boolean) type

というエラーが出てしまいます。

どうすれば良いですか?

python

1import cv2 2 3img = cv2.imread("c:/temp/test.jpg") 4 5# グレースケールに変換する。 6gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 7grey_canny = cv2.Canny(img, 500.0, 300.0) 8 9# ハフ変換で円検出する。 10circles = cv2.HoughCircles( 11 grey_canny, cv2.HOUGH_GRADIENT, dp=1.0, minDist=28, param1=100, param2=9, minRadius=11,maxRadius=15 12) 13 14# 検出結果を描画する。 15if circles is not None: 16 circles = circles.squeeze(axis=0) # (1, NumCircles, 3) -> (NumCircles, 3) 17 18 19 20 21 for cx, cy, r in circles: 22 # 円の円周を描画する。 23 cv2.circle(img, (cx, cy), r, (0, 255, 0), 2) 24 # 円の中心を描画する。 25 cv2.circle(img, (cx, cy), 2, (0, 255, 0), 2) 26 27 28#円の中心座標を表示 29centers = circles[:, :2] 30print(centers) 31 32#円の中心の色を表示 33color = img[centers] 34print(f"Image[{centers}] = BGRA{color}") 35 36 37 38 39 40# 結果を保存する。 41cv2.imwrite("c:/temp/test1.jpg", img) 42cv2.imshow('img', img) 43cv2.waitKey(0) 44cv2.destroyAllWindows()

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下のようにすればいいです。

  • 円は複数検出されることもある。
  • astype(int) で int 型にキャストする。

diff

1- centers = circles[:, :2] 2- print(centers) 3- color = img[centers] 4- print(f"Image[{centers}] = BGRA{color}") 5+ for cx, cy, r in circles.squeeze(axis=0).astype(int): 6+ print(f"{(cx, cy)} = {img[cy, cx]}")

追記

q_sane_q さんがご指摘くださってるように円の中心の色を取得する前に円の中心に色を塗ってしまっているので、取得された色は元の画素値ではなく、その色になってしまいます。
描画する画像はコピーをとっておいたほうがよいと思います。

python

1import cv2 2 3img = cv2.imread("c:/temp/test.jpg") 4 5# グレースケールに変換する。 6gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 7grey_canny = cv2.Canny(img, 500.0, 300.0) 8 9# ハフ変換で円検出する。 10circles = cv2.HoughCircles( 11 grey_canny, 12 cv2.HOUGH_GRADIENT, 13 dp=1.0, 14 minDist=28, 15 param1=100, 16 param2=9, 17 minRadius=11, 18 maxRadius=15, 19) 20 21img_copy = img.copy() # 描画用にコピーしておく。 22 23# 検出結果を描画する。 24if circles is not None: 25 circles = circles.squeeze(axis=0) # (1, NumCircles, 3) -> (NumCircles, 3) 26 27 for cx, cy, r in circles: 28 # 円の円周を描画する。 29 cv2.circle(img_copy, (cx, cy), r, (0, 255, 0), 2) 30 # 円の中心を描画する。 31 cv2.circle(img_copy, (cx, cy), 2, (0, 255, 0), 2) 32 33for cx, cy, r in circles.squeeze(axis=0).astype(int): 34 print(f"{(cx, cy)} = {img[cy, cx]}") 35 36 37# 結果を保存する。 38cv2.imwrite("c:/temp/test1.jpg", img_copy) 39cv2.imshow("img", img_copy) 40cv2.waitKey(0) 41cv2.destroyAllWindows()

投稿2020/11/04 03:56

編集2020/11/04 04:17
tiitoi

総合スコア21956

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

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

q_sane_q

2020/11/04 04:11

ただこのコード、上でcirclesを上書きしてしまってるのと、 あと検出した円の上に(0, 255, 0)で上塗りしてしまってるのが要注意ポイントですね
tiitoi

2020/11/04 04:18

たしかに質問のコードだと、取得した色がcv2.circle() で塗った色になってしまいますね。
lebdom_11

2020/11/04 04:24

円の中心を描画しているものを消したら、ちゃんと円の中心の色を検出できました! お二人ともありがとうございます。
guest

0

「中心座標」がそのままでは整数ではないのでしょう.
適当に整数に丸めてやればよいのではないでしょうか.

投稿2020/11/04 03:54

fana

総合スコア11996

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

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

lebdom_11

2020/11/04 05:06

ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問