我有白色背景和简单形状的图像(每个图像有一个形状).我想确定某个点(x,y)是否在形状内部.我怎么能用opencv做到这一点?
nat*_*ncy 14
要确定一个点是在形状的内部、外部还是在形状的边缘,您可以使用 来检查该点是否在轮廓内cv2.pointPolygonTest()
。该函数返回+1
、-1
、 或0
以分别指示点是在轮廓内部、外部还是在轮廓上。假设我们已经有了形状的轮廓,我们可以简单地将轮廓和(x,y)
点传递给函数。
result = cv2.pointPolygonTest(contour, (x,y), False)
Run Code Online (Sandbox Code Playgroud)
在函数中,第三个参数是measureDist
。如果是True
,则查找图像中的点与轮廓之间的最短距离。如果False
,则确定该点是在轮廓内部、外部还是轮廓上。由于我们不想找到距离,我们将measureDist
参数设置为False
这是一个找到方形轮廓然后检查点是否在轮廓内的示例
测试图片
找到轮廓和检查点后的图像
结果
点 1:-1.0
点2:1.0
点 3:0.0
因此point1在外面,point2在里面,point3在轮廓上
import cv2
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(gray, 120, 255, 1)
cnts = cv2.findContours(canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
point1 = (25, 50)
point2 = (200, 250)
point3 = (200, 350)
# Perform check if point is inside contour/shape
for c in cnts:
cv2.drawContours(image, [c], -1, (36, 255, 12), 2)
result1 = cv2.pointPolygonTest(c, point1, False)
result2 = cv2.pointPolygonTest(c, point2, False)
result3 = cv2.pointPolygonTest(c, point3, False)
# Draw points
cv2.circle(image, point1, 8, (100, 100, 255), -1)
cv2.putText(image, 'point1', (point1[0] -10, point1[1] -20), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), lineType=cv2.LINE_AA)
cv2.circle(image, point2, 8, (200, 100, 55), -1)
cv2.putText(image, 'point2', (point2[0] -10, point2[1] -20), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), lineType=cv2.LINE_AA)
cv2.circle(image, point3, 8, (150, 50, 155), -1)
cv2.putText(image, 'point3', (point3[0] -10, point3[1] -20), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), lineType=cv2.LINE_AA)
print('point1:', result1)
print('point2:', result2)
print('point3:', result3)
cv2.imshow('image', image)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11370 次 |
最近记录: |