濮阳网站建设熊掌号,网站设计过程怎么写,网页设计怎样设置图片大小,最新军事战况点到轮廓的距离
在 OpenCV 中#xff0c;函数 cv2.pointPolygonTest()被用来计算点到多边形#xff08;轮廓#xff09;的最短距离#xff08;也 就是垂线距离#xff09;#xff0c;这个计算过程又称点和多边形的关系测试。该函数的语法格式为#xff1a; retval cv2…点到轮廓的距离
在 OpenCV 中函数 cv2.pointPolygonTest()被用来计算点到多边形轮廓的最短距离也 就是垂线距离这个计算过程又称点和多边形的关系测试。该函数的语法格式为 retval cv2.pointPolygonTest( contour, pt, measureDist ) 式中的返回值为 retval与参数 measureDist 的值有关。 式中的参数如下
contour 为轮廓。pt 为待判定的点。measureDist 为布尔型值表示距离的判定方式。当值为 True 时表示计算点到轮廓的距离。如果点在轮廓的外部返回值为负数如果点在轮廓上返回值为 0如果点在轮廓内部返回值为正数。当值为 False 时不计算距离只返回“-1”、“0”和“1”中的一个值表示点相对于轮廓的位置关系。如果点在轮廓的外部返回值为“-1”如果点在轮廓上返回值为“0”如果点在轮廓内部返回值为“1”。
示例使用函数 cv2.pointPolygonTest()计算点到轮廓的最短距离。
使用函数 cv2.pointPolygonTest()计算点到轮廓的最短距离需要将参数 measureDist 的值设置为 True。
代码如下
import cv2
#----------------原始图像-------------------------
o cv2.imread(cs.bmp)
cv2.imshow(original,o)
#----------------获取凸包------------------------
gray cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
hull cv2.convexHull(contours[0])cv2.polylines(o, [hull], True, (0, 255, 0), 2)
#----------------内部点 A 到轮廓的距离-------------------------
distA cv2.pointPolygonTest(hull, (300, 150), True)
fontcv2.FONT_HERSHEY_SIMPLEX
cv2.putText(o,A,(300,150), font, 1,(0,255,0),2)
print(distA,distA)
#----------------外部点 B 到轮廓的距离-------------------------
distB cv2.pointPolygonTest(hull, (300, 250), True)
fontcv2.FONT_HERSHEY_SIMPLEX
cv2.putText(o,B,(300,250), font, 1,(0,255,0),2)
print(distB,distB)
#------------正好处于轮廓上的点 C 到轮廓的距离-----------------
distC cv2.pointPolygonTest(hull, (423, 112), True)
fontcv2.FONT_HERSHEY_SIMPLEX
cv2.putText(o,C,(423,112), font, 1,(0,255,0),2)
print(distC,distC)#----------------显示-------------------------
cv2.imshow(result1,o)
cv2.waitKey()
cv2.destroyAllWindows()
运行结果 同时程序还会显示如下的结果
distA 16.891650862259112
distB -81.17585848021565
distC -0.0从以上结果可以看出
A 点算出来的距离为“16.891650862259112”是一个正数说明 A 点在轮廓内部。B 点算出来的距离为“-81.17585848021565”是一个负数说明 B 点在轮廓外部。C 点算出来的距离为“-0.0”说明 C 点在轮廓上。
在实际使用中如果想获取位于轮廓上的点可以通过打印轮廓点集的方式获取。例如本例中可以通过语句“print(hull)”获取轮廓上的点。在获取轮廓上的点以后可以将其用作函数 cv2.pointPolygonTest()的参数以测试函数返回值是否为零。
示例2使用函数 cv2.pointPolygonTest()判断点与轮廓的关系。
代码如下
import cv2
#----------------原始图像-------------------------
o cv2.imread(cs.bmp)
cv2.imshow(original,o)
#----------------获取凸包------------------------
gray cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy cv2.findContours(binary,cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
hull cv2.convexHull(contours[0])
image cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)
cv2.polylines(image, [hull], True, (0, 255, 0), 2)
#----------------内部点 A 与轮廓的关系-------------------------
distA cv2.pointPolygonTest(hull, (300, 150),False)
fontcv2.FONT_HERSHEY_SIMPLEX
cv2.putText(image,A,(300,150), font, 1,(0,255,0),3)
print(distA,distA)
#----------------外部点 B 与轮廓的关系-------------------------
distB cv2.pointPolygonTest(hull, (300, 250), False)
fontcv2.FONT_HERSHEY_SIMPLEX
cv2.putText(image,B,(300,250), font, 1,(0,255,0),3)
print(distB,distB)
#----------------边缘线上的点 C 与轮廓的关系----------------------
distC cv2.pointPolygonTest(hull, (423, 112),False)
fontcv2.FONT_HERSHEY_SIMPLEX
cv2.putText(image,C,(423,112), font, 1,(0,255,0),3)print(distC,distC)
#----------------显示-------------------------
cv2.imshow(result,image)
cv2.waitKey()
cv2.destroyAllWindows()运行结果
同时程序还会显示如下的运行结果
distA 1.0
distB -1.0
distC 0.0从以上结果可以看出
A 点算出来的关系值为“1”说明该点在轮廓的内部。B 点算出来的关系值为“-1”说明该点在轮廓的外部。C 点算出来的关系值为零值说明该点在轮廓上。
在实际应用中我们可以拿这个方法去判断模板检测的像素点是否在一个指定的ROI区域内具体应用示例我们后续在实战篇中讲解并代码示例。