OpenCV – 点がポリゴンの中に含まれるかどうか判定する

目次

概要

OpenCV の cv2.pointPolygonTest() を使用して、点がポリゴンの中に含まれるかどうかを判定する方法を解説します。

cv2.pointPolygonTest

retval = cv2.pointPolygonTest(contour, pt, measureDist)

公式リファレンス: cv2.pointPolygonTest

引数
名前 デフォルト値
contour ndarray
ポリゴンを表す点の一覧
pt tuple of 2 ints
measureDist bool
  • measureDist=False の場合、点が輪郭の内側の場合は +1、輪郭の境界線上の場合は 0、輪郭の外側の場合は -1 を返す。
  • measureDist=True の場合、点と輪郭との距離を返す。点が輪郭の内側の場合は正の値、輪郭の境界線上の場合は 0、輪郭の外側の場合は負の値を返す。
返り値
名前 説明
int ポリゴンの中に点が含まれるかどうか (measureDist の説明参照)
In [1]:
import cv2
import numpy as np
from matplotlib import pyplot as plt

# ポリゴン
polygon = np.array([[170, 113], [167, 57], [259, 50], [259, 105]])
# 点
points = [(100, 100), (250, 70), (170, 113), (259, 250)]

# 描画する。
fig, ax = plt.subplots()
ax.set_xlim([0, 300])
ax.set_ylim([0, 300])
ax.set_aspect("equal")
ax.add_patch(plt.Polygon(polygon, fill=False))

for i, pt in enumerate(points):
    # 点 pt がポリゴン polygon に含まれるかどうか判定する。
    color = "green" if cv2.pointPolygonTest(polygon, pt, False) >= 0 else "gray"

    ax.scatter(pt[:1], pt[1:], color=color)
    ax.text(*pt, "({}, {})".format(*pt), fontsize=12)

plt.show()

コメント

コメントする

目次