《OpenCV轻松入门:面向Python》读书笔记
作者:李立宗
出版社:电子工业出版社
出版时间:2019-05
第12章 图像轮廓
12.5 凸包
1)定义
逼近多边形是轮廓的高度近似,但是有时候,我们希望使用一个多边形的凸包来简化它。
凸包跟逼近多边形很像,只不过它是物体最外层的“凸”多边形。
凸包指的是完全包含原有轮廓,并且仅由轮廓上的点所构成的多边形。
凸包的每一处都是凸的,即在凸包内连接任意两点的直线都在凸包的内部。在凸包内,任意连续三个点的内角小于180°。
2)获取凸包
OpenCV提供函数cv2.convexHull()用于获取轮廓的凸包。
【例12.21】使用函数cv2.convexHull()获取轮廓的凸包。
import cv2
# --------------读取并绘制原始图像------------------
o = cv2.imread('hand.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)
# --------------显示凸包------------------
cv2.imshow("result",o)
cv2.waitKey()
cv2.destroyAllWindows()
图12-26 【例12.21】程序的运行结果
3)凸缺陷
凸包与轮廓之间的部分,称为凸缺陷。在OpenCV中使用函数cv2.convexityDefects()获取凸缺陷。
【例12.22】使用函数cv2.convexityDefects()计算凸缺陷。
import cv2
#----------------原图--------------------------
img = cv2.imread('hand.bmp')
cv2.imshow('original',img)
#----------------构造轮廓--------------------------
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255,0)
contours, hierarchy = cv2.findContours(binary,
cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
#----------------凸包--------------------------
cnt = contours[0]
hull = cv2.convexHull(cnt,returnPoints = False)
defects = cv2.convexityDefects(cnt,hull)
print("defects=\n",defects)
#----------------构造凸缺陷--------------------------
for i in range(defects.shape[0]):
s,e,f,d = defects[i,0]
start = tuple(cnt[s][0])
end = tuple(cnt[e][0])
far = tuple(cnt[f][0])
cv2.line(img,start,end,[0,0,255],2)
cv2.circle(img,far,5,[255,0,0],-1)
#----------------显示结果、释放图像--------------------------
cv2.imshow('result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
图12-27 【例12.22】程序的运行结果
4)几何学测试
- 1.测试轮廓是否是凸形的
在OpenCV中,可以用函数cv2.isContourConvex()来判断轮廓是否是凸形的 - 2.点到轮廓的距离
在OpenCV中,函数cv2.pointPolygonTest()被用来计算点到多边形(轮廓)的最短距离(也就是垂线距离),这个计算过程又称点和多边形的关系测试。
网友评论