opencv判断一个点是否在轮廓内pointPolygonTest的用法

本文深入解析了OpenCV中的pointPolygonTest函数,该函数用于判断一个点是否位于给定轮廓内部、外部或轮廓上。文章详细介绍了函数的参数设置及返回值意义,特别是measureDist参数如何影响判断结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OpenCV函数pointPolygonTest():

C++: double pointPolygonTest(InputArray contour, Point2f pt, bool measureDist)

用于判断一个点是否在轮廓中 :
当measureDist设置为true时,若返回值为正,表示点在轮廓内部,返回值为负,表示在轮廓外部,返回值为0,表示在轮廓上。
当measureDist设置为false时,若返回值为+1,表示点在轮廓内部,返回值为-1,表示在轮廓外部,返回值为0,表示在轮廓上。

			// 窗口坐标转换图片坐标
				Point2f srcPt;
				srcPt.x = pt.x()*srcSize.width()*1.0 / lbSize.width();
				srcPt.y = pt.y()*srcSize.height()*1.0 / lbSize.height();
				for (int i = 0; i < pointsresult5.size(); i++)
				{
					if (pointPolygonTest(pointsresult5[i], srcPt, false) == 1)
					{
						strRate = QString::number(contourRate[i] * 100)+"%";
						break;
					}			
				}
### OpenCV轮廓内接圆的函数使用方法 在 OpenCV 的 Python 接口中,虽然没有直接提供专门用于计算轮廓内接圆(Inscribed Circle)的函数,但可以通过组合多个函数实现这一目的。以下是具体的方法: #### 方法概述 为了找到轮廓的最大内接圆,可以利用 `cv2.pointPolygonTest()` 和 `cv2.minMaxLoc()` 这两个函数完成。`cv2.pointPolygonTest()` 可以测量任意轮廓的距离,其中轮廓内部返回正值,外部返回负值,而轮廓上的则返回零。通过遍历整个图像区域内的像素,并记录下这些轮廓之间的最大距离及其对应的坐标位置,即可得到内接圆的圆心和半径。 下面是具体的代码示例[^4]: ```python import cv2 import numpy as np # 加载图片并转换为灰度图 image = cv2.imread('example.png') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 预处理:二值化、形态学操作等 _, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if contours: contour = max(contours, key=cv2.contourArea) # 获取面积最大的轮廓 # 创建一个掩膜矩阵 mask = np.zeros(gray.shape, dtype=np.uint8) cv2.drawContours(mask, [contour], -1, 255, thickness=-1) # 计算所有轮廓的距离 dist_transform = cv2.distanceTransform(mask, distanceType=cv2.DIST_L2, maskSize=5) # 找到最大距离的位置作为圆心 _, radius, center, _ = cv2.minMaxLoc(dist_transform) # 绘制结果 result = image.copy() cv2.circle(result, tuple(center), int(radius), (0, 255, 0), 2) cv2.imshow("Result", result) cv2.waitKey(0) ``` 上述代码实现了以下功能: - **读取输入图像** 并将其转化为灰度模式。 - 对灰度图像执行阈值分割,从而获得二值化的黑白图像。 - 利用 `findContours` 提取出所有的轮廓信息。 - 寻找具有最大面积的一个封闭图形作为候选对象。 - 构建仅含此选定形状的空白蒙版层。 - 应用欧几里得距离变换算法生成每一至最近边界的映射表。 - 查找出全局最高数值所处地即代表最佳拟合球体中心;其高度量级对应于该理想状况下的曲率半径长度单位数值得出结论。 #### 注意事项 当尝试定位较大范围或者复杂结构的目标物体内嵌入式的最小覆盖型态时,可能需要调整参数设置来优化性能表现。例如改变初始滤波器核大小或是采用不同的插补策略等等都可以有效提升最终成果质量水平[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值