2値化画像から輪郭を出すことができ,輪郭の座標も出せたのですが,輪郭の座標の値を使って重心からの距離を計算したいので輪郭の座標をx,yに分けて変数にしたいですが,方法がわかりません.この方法自体が良くないのであればそれも含めて教えてほしいです.
仕様バージョンはpython3.8.8(anaconda3のspyder),opencv4.5.4です
使用した画像はこちらです
該当のソースコード
import cv2 import numpy as np #HSV上限下限 lower_white = (0,53,93) upper_white = (255,255,240) # 画像読み込み img = cv2.imread("c:/temp/asp.jpg") # HSV化 img1 = cv2.cvtColor(img, cv2.COLOR_BGR2HSV_FULL) #2値化 thresh = cv2.inRange(img1, lower_white, upper_white) # 輪郭を抽出する contours, hierarchy = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) # 読み込んだ画像に輪郭を描画 img_contours = cv2.drawContours(img, contours, -1, (255, 0 ,0), 1) cv2.imshow("img", img_contours) cv2.imshow('th',thresh) print(contours) cv2.waitKey(0) # ウィンドウを破棄 cv2.destroyAllWindows()
https://hk29.hatenablog.jp/entry/2020/02/01/162533
に記載のpythonコードの「輪郭抽出の手法A」の「輪郭抽出」で、「x_list」と「y_list」にそれぞれ「x座標」と「y座標」が格納されるので、参考にしてみてください
ありがとうございます.参考で見ていたのですが「輪郭抽出」のなかで2か所わからなかったので聞いてもよろしいでしょうか
・cv2.contourArea(contours[i]) < 500:について
→自分の認識では輪郭内の面積を求める関数なのですがなぜ必要なのかがよくわかりません
・if i%2==0:
→どのような条件でなぜ必要なのかという意味でわかりません
> ・cv2.contourArea(contours[i]) < 500:について
→自分の認識では輪郭内の面積を求める関数なのですがなぜ必要なのかがよくわかりません
https://hk29.hatenablog.jp/entry/2020/02/01/162533
の上の方にあるチューリップの画像のあたりを見てください
「処理4. マスクの作成」では白いけど、「処理5. オリジナル画像を元に、チューリップ花の輪郭を描画する」では輪郭が付いてない場所がありますよね
画像の上の辺の右の方とか
そのような、すごく小さな部分を無視したいためだと思います
質問者さんの目的で、そういうことをする必要が無いなら、その処理は無視すればいいです
> ・if i%2==0:
→どのような条件でなぜ必要なのかという意味でわかりません
https://hk29.hatenablog.jp/entry/2020/02/01/162533
の「輪郭抽出の手法A」の「輪郭抽出」の「#print(buf_np)」の「#」を削除して、その行を有効にしてから実行したら、「buf_np」が表示されますので、まずそれを見てください
「for i, elem in enumerate(buf_np):」以降で、「buf_np」をx座標とy座標に分離してるのですが、上記で表示された「buf_np」と、「for i, elem in enumerate(buf_np):」以降のコードを参照しながら、一旦自分で考えてみてください
なお、もし「i%2」の「%」の意味が分からないのなら、下記を見てください
https://www.curict.com/item/b1/b146ef1.html
わかりやすく説明いただきありがとうございます.これで一度やってみようと思います.