如何检查点是否位于轮廓内部?

19

我已经在极值点周围画了一个轮廓线。在多边形内部还有其他点。 如何检查它们是否在轮廓线内?

1个回答

37
您可以使用OpenCV中可用的cv2.pointPolygonTest()函数。例如:dist = cv2.pointPolygonTest(cnt,(50,50),True)。在此示例中,我们正在检查坐标(50,50)是否存在于轮廓cnt中。
  1. dist返回以下三种情况之一:

    • 如果点在轮廓内,则返回正数
    • 如果点在轮廓外,则返回负数
    • 如果点在轮廓上,则返回
  2. cv2.pointPolygonTest()函数中,第三个参数决定您想要以下两种情况之一:

    • 如果设置为Truedist将返回点的正/负距离,具体取决于该点是否位于轮廓内部或外部。
    • 另一方面,如果设置为False,则它将根据点位于轮廓内部、外部还是轮廓上返回+1、-1或0。
有关详细信息,请参见文档

说明:

我添加了一个示例来展示如何使用它。我考虑了以下图像以获取轮廓: enter image description here 我假设以下点用于说明: (50, 70), (170, 152), (152, 48) enter image description here
dist1 = cv2.pointPolygonTest(contours[0], (50, 70), True) #green 
dist2 = cv2.pointPolygonTest(contours[0], (170, 152), True) #blue
dist3 = cv2.pointPolygonTest(contours[0], (152, 48), True) #red

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

输出:

('dist1 : ', -45.17742799230607)
('dist2 : ', 49.9799959983992)
('dist3 : ', -0.0)

我可以使用这个函数来检查点是否在多边形内吗? - OPV
是的。您使用的多边形必须作为轮廓传递。 - Jeru Luke
1
是的。逐个传入一个点。如果您有一堆要测试的点,请将它们依次传递在一个“列表”中。 - Jeru Luke
1
谢谢。我创建了一个四边形并检查了点在其中的位置:L_DANGEROUS_ZONE = [ [57,356], [357,343], [828,847], [319,1069] ] ctr_dng = np.array(L_DANGEROUS_ZONE).reshape((-1,1,2)).astype(np.int32) dist = cv2.pointPolygonTest(ctr_dng,(center_x, center_y), True) 如果距离大于等于0: k_dng += 1 - Orlov Const
奇怪的是,这个函数要求轮廓的np.dtype为int类型。 - GeneralCode
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接