【问题标题】:How to check if point is placed inside contour? [duplicate]如何检查点是否位于轮廓内? [复制]
【发布时间】:2018-11-13 04:24:30
【问题描述】:

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

【问题讨论】:

    标签: python opencv opencv3.0 opencv-contour


    【解决方案1】:

    您可以使用 OpenCV 中的cv2.pointPolygonTest() 函数。

    例如:

    dist = cv2.pointPolygonTest(cnt,(50,50),True)

    在这个例子中,我们正在检查坐标(50, 50)是否存在于轮廓cnt

    1. dist 返回以下三个之一:

      • 值,如果该点轮廓内
      • 值,如果该点轮廓之外
      • ,如果该点轮廓上
    2. 在函数cv2.pointPolygonTest() 中,第三个参数决定您是否需要以下两个之一:

      • 如果是Truedist 会返回点的正距离或负距离,如果它分别位于轮廓内部或外部。
      • 另一方面,如果设置为 False,则返回 +1、-1 或 0,具体取决于位于内部、外部或轮廓上的点

    详情请见THE DOCS

    插图:

    我添加了一个示例来展示它是如何工作的。我考虑了以下获得轮廓的图像:

    我假设以下几点用作说明:

    (50, 70), (170, 152), (152, 48)

    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)
    

    【讨论】:

    • 我可以使用这个函数来检查多边形内的点吗?
    • 是的。您使用的多边形必须作为轮廓传递
    • 好的,我将多边形绘制为:pts = np.array(b, np.int32) pts = pts.reshape((-1,1,2)) cv2.polylines(image,[pts],True,(0,255,0))
    • 是的。一次通过一个点。如果您有很多点要测试,请在list 中一个接一个地传递它们。
    • 谢谢。我创建了一个四边形并检查了其中点的位置: 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) 如果 dist >= 0: k_dng += 1
    猜你喜欢
    • 2018-04-30
    • 2016-12-09
    • 1970-01-01
    • 2015-10-02
    • 2021-09-07
    • 2020-06-15
    • 1970-01-01
    • 2016-09-11
    相关资源
    最近更新 更多