美文网首页
图像轮廓之凸包

图像轮廓之凸包

作者: 大龙10 | 来源:发表于2021-11-09 06:30 被阅读0次

《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()被用来计算点到多边形(轮廓)的最短距离(也就是垂线距离),这个计算过程又称点和多边形的关系测试。

相关文章

  • 图像轮廓之凸包

    《OpenCV轻松入门:面向Python》读书笔记作者:李立宗出版社:电子工业出版社出版时间:2019-05 第1...

  • 凸包---OpenCV-Python开发指南(28)

    前言 逼近多边形是某个图像轮廓的高度近似,而凸包的提出是为了简化逼近多边形的。其实,凸包跟逼近多边形很像,只不过它...

  • convexHull(凸包检测)

    概念 凸包对于图像来说其实就是图像轮廓突出点的连线。对于点集合来说就是点集合最外围点的连线,通过这些连线形成的多边...

  • 图像轮廓(2)

    1. 凸包 凸缺陷可以用来处理手势识别问题 points:轮廓clockwise:True:凸包按顺时针方向排列;...

  • 图像轮廓之轮廓拟合

    《OpenCV轻松入门:面向Python》读书笔记作者:李立宗出版社:电子工业出版社出版时间:2019-05 第1...

  • 图像轮廓之查找并绘制轮廓

    《OpenCV轻松入门:面向Python》读书笔记作者:李立宗出版社:电子工业出版社出版时间:2019-05 第1...

  • 图像轮廓

    边缘检测虽然能检测出边缘,但边缘是不连续的,并不是一个整体。图像轮廓是将边缘连接起来形成的一个整体,用于后续的计算...

  • 图像轮廓

    图像轮廓 什么是轮廓轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析...

  • 凸包

    逼近多边形是轮廓的高度近似,但是有时候我们希望使用一个多边形的凸包来简化它。凸包跟逼近多边形很像,只不过它是物体最...

  • Python+OpenCV教程番外篇9:凸包及更多轮廓特征

    主站:http://ex2tron.wang原文:Python+OpenCV教程番外篇9:凸包及更多轮廓特征 计算...

网友评论

      本文标题:图像轮廓之凸包

      本文链接:https://www.haomeiwen.com/subject/qavqzltx.html