Pynote

Python、機械学習、画像処理について

OpenCV - pointPolygonTest() でポリゴンの中に点が含まれるかどうか調べる。

概要

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

pointPolygonTest()

retval = cv2.pointPolygonTest(contour, pt, measureDist)
  • 引数
    • contour: 輪郭
    • pt: 点
    • measureDist: 計測方法
      • measureDist=False の場合、点が輪郭の内側の場合は +1、輪郭の境界線上の場合は 0、輪郭の外側の場合は -1 を返す。
      • measureDist=True の場合、点と輪郭との距離を返す。点が輪郭の内側の場合は正の値、輪郭の境界線上の場合は 0、輪郭の外側の場合は負の値を返す。
  • 返り値
    • retval: 計測した値

サンプルコード

import cv2
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Polygon

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

# 描画する。
fig, ax = plt.subplots()
ax.set_xlim([0, 300])
ax.set_ylim([0, 300])
ax.set_aspect('equal')
ax.add_patch(Polygon(polygon, fill=False))
for i, pt in enumerate(points):
    # 点 pt がポリゴン polygon に含まれるかどうか判定する。
    if cv2.pointPolygonTest(polygon, pt, False) >= 0:
        color='green'
    else:
        color='gray'
    ax.scatter(pt[:1], pt[1:], color=color)
    ax.text(*pt, '({}, {})'.format(*pt), fontsize=12)

plt.show()

内側に含まれると判定された点は緑色で表示されている。