如何判断点在多边形内部:OpenCV--cv2.pointPolygonTest()方法详解

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 如何判断点在多边形内部:OpenCV--cv2.pointPolygonTest()方法详解


问题描述

如何判断一个点是在多边形的内部还是在多边形外面?本文直接使用opencv提供的cv2.pointPolygonTest()函数进行判断。下面对该函数进行详细说明,并给出具体示例。

cv2.pointPolygonTest()函数使用说明

代码示例:

result = cv2.pointPolygonTest(contour, test_point, measureDist) 

参数说明

contour参数:某一轮廓点的列表,如:polygon = np.array([[10, 10], [100, 10], [100, 100], [10, 100]], dtype=np.int32)

test_point参数:像素点坐标(x,y)

measureDist参数:如果measureDist为True则输出该像素点到轮廓最近距离。当measureDist设置为false时,若返回值为+1,表示点在轮廓内部,返回值为-1,表示在轮廓外部,返回值为0,表示在轮廓上。

如果我们需要判断一个点是在多边形的内部,只需要将measureDist参数设为False即可,当输出结果为正时,即可判断点在多边形的内部。示例代码如下:

result = cv2.pointPolygonTest(polygon, test_point, measureDist=False)
print(result)
# 判断结果
if result > 0:
    print("点在多边形内部")
elif result == 0:
    print("点在多边形边界上")
else:
    print("点在多边形外部")

算法原理说明

多边形,随便定一个点,然后通过这个点水平划一条线,先数数看这条横线和多边形的边相交几次,(或者说先排除那些不相交的边,第一个判断条件),然后再数这条横线穿越多边形的次数是否为奇数,如果是奇数,那么该点在多边形内,如果是偶数,则在多边形外。如下图所示:

完整示例

定义点与多边形并展示

定义点与多边形

# 定义多边形的顶点
polygon = np.array([[10, 10], [100, 10], [100, 100], [10, 100]], dtype=np.int32)
# 要判断的点
test_point = [50, 50]

画出多边形及点进行展示

import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg')
# 定义多边形的顶点
polygon = np.array([[10, 10], [100, 10], [100, 100], [10, 100]], dtype=np.int32)
# 要判断的点
test_point = [50, 50]
# 画出点与多边形并展示
# 创建一个新的图像
fig, ax = plt.subplots()
# 绘制多边形
ax.plot(polygon[:,0], polygon[:,1], 'r-', lw=2, label='Polygon')
ax.fill(polygon[:,0], polygon[:,1], 'r', alpha=0.3)
# 绘制点
ax.plot(test_point[0], test_point[1], 'go', markersize=10, label='Test Point')
# 添加标签和轴限制
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.legend()
ax.set_xlim(0, 110)  # 设置x轴范围
ax.set_ylim(0, 110)  # 设置y轴范围
# 显示图像
plt.show()

判断点是否在多边形内部

import cv2
import numpy as np
# 定义多边形的顶点
polygon = np.array([[10, 10], [100, 10], [100, 100], [10, 100]], dtype=np.int32)
# 要判断的点
test_point = [50, 50]
# 判断test_point点是否在多边形内部
# 使用pointPolygonTest函数
result = cv2.pointPolygonTest(polygon, test_point, measureDist=False)
print(result)
# 判断结果
if result > 0:
    print("点在多边形内部")
elif result == 0:
    print("点在多边形边界上")
else:
    print("点在多边形外部")

打印结果如下:

相关文章
|
算法 C++ 计算机视觉
OpenCV-图像像素遍历操作的三种方法对比(程序提速)
OpenCV-图像像素遍历操作的三种方法对比(程序提速)
419 0
|
存储 编解码 API
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
1104 1
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
3805 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
机器学习/深度学习 传感器 算法
OpenCV4工业缺陷检测的六种方法
OpenCV4工业缺陷检测的六种方法
|
算法 计算机视觉 索引
python---OpenCv(二),背景分离方法较有意思
python---OpenCv(二),背景分离方法较有意思
297 1
|
机器学习/深度学习 TensorFlow 算法框架/工具
OpenCV读取tensorflow 2.X模型的方法:将SavedModel转为frozen graph
【2月更文挑战第22天】本文介绍基于Python的tensorflow库,将tensorflow与keras训练好的SavedModel格式神经网络模型转换为frozen graph格式,从而可以用OpenCV库在C++等其他语言中将其打开的方法~
311 1
OpenCV读取tensorflow 2.X模型的方法:将SavedModel转为frozen graph
|
计算机视觉 Python
opencv 处理图像去噪的几种方法学习
OpenCV 提供了多种图像去噪的方法,以下是一些常见的去噪技术以及相应的 Python 代码示例: 均值滤波:使用像素邻域的灰度均值代替该像素的值。
339 0
|
定位技术 计算机视觉 C++
C++计算机视觉库OpenCV在Visual Studio 2022的配置方法
C++计算机视觉库OpenCV在Visual Studio 2022的配置方法
605 1
|
存储 计算机视觉 数据格式
OpenCV库、Armadillo库矩阵数据格式互转的方法
本文介绍在C++语言中,矩阵库Armadillo的mat、vec格式数据与计算机视觉库OpenCV的Mat格式数据相互转换的方法~
245 1
OpenCV库、Armadillo库矩阵数据格式互转的方法
|
机器学习/深度学习 传感器 算法
带你了解OpenCV4工业缺陷检测的六种方法
带你了解OpenCV4工业缺陷检测的六种方法
340 0