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

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

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

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

Python

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

Q&A

解決済

1回答

2991閲覧

[Python3.7]2つの最小外接円の中心座標を出力したい

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

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

Python

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

0グッド

0クリップ

投稿2020/10/20 11:48

編集2020/10/20 18:27

前提・実現したいこと

2つの円の中心座標を出力させたいです。

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

2つの最小外接円の中心座標の値を出力する方法が知りたいです。 下のソースコードでは、1つの最小外接円の中心座標であれば出力することができます。

該当のソースコード

import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('test.jpg') img = cv2.medianBlur(img, 5) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret,thresh = cv2.threshold(img, 127, 255, 0) frame1 = np.array(thresh) frame2 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY) contours, _ = cv2.findContours(frame2, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) for i, cnt in enumerate(contours): # 輪郭の面積を計算する。 area = cv2.contourArea(cnt) # 抽出する範囲を指定 if area > 100 and area < 50000: #最小外接円を計算する (x,y),radius = cv2.minEnclosingCircle(cnt) cv2.circle(img,(int(x),int(y)),int(radius),(0,0,255),3) plt.plot(x,y,marker='.') print("(x,y)", (x,y)) plt.imshow(img,"gray") plt.colorbar() plt.show()

イメージ説明

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

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

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

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

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

toast-uz

2020/10/20 12:50

2つというのは、それぞれ何に接する最小外接円なのでしょうか?
退会済みユーザー

退会済みユーザー

2020/10/20 13:49

図があると分かりやすくなると思います。 ――とはいえ、print("(x,y)", (x,y))をfor文の中に入れれば、cntがareaの条件を満たす限りいくつでも中心座標を出しそうなものですが…。
退会済みユーザー

退会済みユーザー

2020/10/20 19:18 編集

toast-uzさん 文だけだと説明不足でしたので、図を追加しました。 ※図は一例としてきれいな白黒の円を取り上げています。 ※実際はカラー画像で、ここまできれいな円ではないです。 やりたいことは2つの円にそれぞれ接する最小外接円です。
退会済みユーザー

退会済みユーザー

2020/10/20 19:20 編集

ベストアンサーの付け方がわからず、、。 fourteenlengthさんの、print("(x,y)", (x,y))をfor文の中に入れたらいくつでも中心座標を出力できました。ありがとうございます! 細かなことですが、 (x1,y1)=,(x2,y2)=のように中心座標ごとに番号を振りたい場合は、また上のソースコードに追加して定義することがありますよね...? お手間ですが、そこもわかりましたら教えていただきたいです
toast-uz

2020/10/20 22:17 編集

「2つの図形があるtest.jpgに対しての図形ごとの最小外接円をもとめて表示できたのだが、円の中心座標を出力する際に1つしか表示されなくて困っている」という意味ですね。なぜ2つなのか?とか、2つ目の最小外接円そのものが求められないのか?とか、中心座標というのは「2つの円」の中点なのか?とか、読み取れませんでした。
退会済みユーザー

退会済みユーザー

2020/10/20 22:31 編集

toast-uzさん ご指摘の内容はごもっともです。 図込みでさらに詳しく現状の問題をお伝えするべきでした。 またここで質問する機会がありましたら、それを踏まえた上で投稿します。
guest

回答1

0

ベストアンサー

for文の中にprintを入れたのと、リストにその中身とi番目を入れておけばよさそうですね。
※大きい方の円は面積が大きいので、検出されません。
for文の中の面積の条件は適宜緩くしてください。

Python3

1import cv2 2import numpy as np 3import matplotlib.pyplot as plt 4 5img = cv2.imread('test.jpg') 6img = cv2.medianBlur(img, 5) 7gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 8 9ret,thresh = cv2.threshold(img, 127, 255, 0) 10frame1 = np.array(thresh) 11frame2 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY) 12 13contours, _ = cv2.findContours(frame2, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 14 15coordinates = [] 16for i, cnt in enumerate(contours): 17 # 輪郭の面積を計算する。 18 area = cv2.contourArea(cnt) 19 # 抽出する範囲を指定 20 if area > 100 and area < 50000: 21 #最小外接円を計算する 22 (x,y),radius = cv2.minEnclosingCircle(cnt) 23 24 # For文の内側に移動 25 print("(x,y)", (x,y)) 26 27 # 後で取り出せるようにi番目,x,yをリストに入れる 28 coordinates.append((i,x,y)) 29 30 cv2.circle(img,(int(x),int(y)),int(radius),(0,0,255),3) 31 plt.plot(x,y,marker='.') 32 33# print("(x,y)", (x,y)) 34 35# contoursの中でi番目の情報付き 36for i,x,y in coordinates: 37 print("contoursの中でi: %s番目, 中心座標(x:%s,y:%s)"%(i,x,y)) 38 39plt.imshow(img,"gray") 40plt.colorbar() 41plt.show()

投稿2020/10/20 21:57

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/10/20 22:17

追加のお願いにも答えていただきありがとうございます! 大きい円はfor文の中の面積の条件を変えることで出力することができました。 i番目の出力も確認しました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問