web-dev-qa-db-ja.com

ポイントが輪郭の内側に配置されているかどうかを確認するにはどうすればよいですか?

極値の周りに等高線を描きました。ポリゴンフィギュアの中には他にもポイントがあります。それらが輪郭の内側にあるかどうかを確認する方法は?

4
OPV

OpenCVで利用可能なcv2.pointPolygonTest()関数を使用できます。

例えば:

dist = cv2.pointPolygonTest(cnt,(50,50),True)

この例では、座標_(50, 50)_が等高線cntとともに存在するかどうかを確認しています。

  1. distは、次の3つのいずれかを返します。

    • ポイントが内側輪郭の場合の値
    • ポイントが外側輪郭の場合の値
    • ゼロポイントがオン輪郭の場合
  2. 関数cv2.pointPolygonTest()内で、3番目のパラメーターは次の2つのいずれかが必要かどうかを決定します。

    • Trueの場合、distは、ポイントが輪郭の内側または外側にある場合、ポイントの正または負の距離を返します。
    • 一方、Falseに設定されている場合は、輪郭の内側、外側、または輪郭上にあるポイントに応じて、それぞれ+ 1、-1、または0を返します。

詳細については、 THE DOCS を参照してください。

イラスト:

それがどのように機能するかを示す例を追加しました。輪郭が得られた次の画像を検討しました。

enter image description here

例として、次の点を想定しました。

_(50, 70), (170, 152), (152, 48)_

enter image description here

_dist1 = cv2.pointPolygonTest(contours[0], (50, 70), True)
dist2 = cv2.pointPolygonTest(contours[0], (170, 152), True)
dist3 = cv2.pointPolygonTest(contours[0], (152, 48), True)

print('dist1 : ', dist1)
print('dist2 : ', dist2)
print('dist3 : ', dist3)
_

出力:

_('dist1 : ', -45.17742799230607)
('dist2 : ', 49.9799959983992)
('dist3 : ', -0.0)
_
15
Jeru Luke