🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

Python

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

Q&A

1回答

3525閲覧

Python 円の重心計算

akua

総合スコア1

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

Python

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

0グッド

0クリップ

投稿2020/12/09 00:56

編集2020/12/09 03:32

前提・実現したいこと

複数の円に対して、重心計算を行いたいです。

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

円が1つの場合は正常に作動するのですが、円が複数存在する場合、それぞれの円の重心が計算されるのではなく、重心が1つしか計算されません(その座標も正しいものではありません) 構文エラーはありませんが、円の個数と計算される重心の数が合いません。

該当のソースコード

Python

1#輪郭検出 2contours,hierarchy =cv2.findContours(dst,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) 3#面積計算 4areas = np.array(list(map(cv2.contourArea,contours))) 5# 重心の計算 6max_idx = np.argmax(areas) 7max_area = areas[max_idx] 8result = cv2.moments(contours[max_idx]) 9x = int(result["m10"]/result["m00"]) 10y = int(result["m01"]/result["m00"]) 11coordination=([x],[y]) 12#CSVファイル作成 13with open('Cordinations.csv','a',newline="") as f: 14 writer=csv.writer(f) 15 writer.writerow([x,y]) 16 f.close()

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

使用言語:Python
作業環境:Visual Studio
OpenCV(4.4)
作業画像

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

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

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

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

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

meg_

2020/12/09 01:22

> 以下のようなエラーが発生しました。 エラーメッセージが掲載されていません。追記してください。
guest

回答1

0

python

1import cv2 2import matplotlib.pyplot as plt 3import imutils 4%matplotlib inline 5 6img=cv2.imread('3.png') 7gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 8_,bw = cv2.threshold(gray,120,255,cv2.THRESH_BINARY) 9#輪郭を検出。 10contours,hierarchy = cv2.findContours(bw, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 11#輪郭を書き込み。 12contimg=cv2.drawContours(img,contours,-1,(0,255,0),3) 13count = len(contours) 14plt.imshow(contimg) 15 16 17cnts = cv2.findContours(bw.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) 18cnts = imutils.grab_contours(cnts) 19# loop over the contours 20cxAll=[] 21cyAll=[] 22for c in cnts: 23 # compute the center of the contour 24 M = cv2.moments(c) 25 cX = int(M["m10"] / M["m00"]) 26 cY = int(M["m01"] / M["m00"]) 27 cxAll.append(cX) 28 cyAll.append(cY) 29 # draw the contour and center of the shape on the image 30 cv2.drawContours(img, [c], -1, (0, 255, 0), 2) 31 cv2.circle(img, (cX, cY), 7, (255, 0, 0), -1) 32 cv2.putText(img, "center", (cX - 20, cY - 20), 33 cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2) 34 35# show the image 36cv2.imshow("Image", img) 37cv2.waitKey(0) 38print(cxAll) 39print(cyAll)
[309, 159, 347, 102, 210] [306, 263, 214, 180, 91]

イメージ説明

こんにちは、こちらのページを参考に作成しました。
cv2.findContoursで、各ブロブを検出したのちにcv2.momentsで重心を計算→これをForループ内で繰り返し、、、としていけばうまく重心が計算できると思います。上の参考画像では重心が正しく計算できていることをご確認ください。お役に立てば幸いです。よろしくお願いいたします。

投稿2020/12/26 09:56

Kenta_py

総合スコア132

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問