如何正确使用cv2.pointPolyginTest()和cv2.findcontours()?

3
我希望使用cv2.pointPolygonTest来检查点是否位于轮廓内或外,但我无法弄清楚为什么它不起作用。
这是我获取轮廓的方式:
img_name = a295121c-f893-43f5-8d00-6bfddbc19658.jpg"
im = cv2.imread(img_name)
im_gray = cv2.cvtColor(im, cv2.COLOR_RGB2GRAY)

ret, thresh = cv2.threshold(im_gray, 10, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_TC89_L1)

这就是我检查点是否在检测到的对象内部或外部的方法。

    x1 = cv2.pointPolygonTest(contours[0], (x, y), False)

在这个阈值图像上它工作得很好:

test1

(x,y)在物体内部时,x1会被正确计算。

np.shape(contours)等于(1, 241, 1, 2)

然而,在这张图片上:

enter image description here

所有点都被计算为外部。

np.shape(contours)等于(11,)

我想我没有正确使用轮廓,但我无法确定应该传递哪个轮廓维度给cv2.pointPolygonTest()


通常更容易在黑色初始化的二进制掩模上绘制白色填充轮廓(drawContours),然后每个点都具有值0(轮廓外)或255(轮廓内)。 - Miki
1个回答

3
我想知道你测试点的代码是否只有这些:

我想知道您测试点的代码是否只有这些:

 x1 = cv2.pointPolygonTest(contours[0], (x, y), False)

在这段代码中,该函数仅测试第一个轮廓。在第二个图像中可能存在多个轮廓,请尝试使用循环。

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