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

简介: 凸包---OpenCV-Python开发指南(28)

前言


逼近多边形是某个图像轮廓的高度近似,而凸包的提出是为了简化逼近多边形的。其实,凸包跟逼近多边形很像,只不过它是物体最外层的“凸”多边形。


简单的概括,凸包是指完全包含原有轮廓,并且仅由轮廓上的点所构成的多边形。凸包的特点是每一处都是凸的,即在凸包内连接任意两点的直线都在凸包的内部,并且任意连续3个点的内角小于180度。


OpenCV中,它给我们提供cv2.convexHull()来获取轮廓的凸包。其完整定义如下:

def convexHull(points, hull=None, clockwise=None, returnPoints=None): 

points:轮廓


hull:返回值,为凸包角点。可以理解为多边形的点坐标,或索引。


clockwise:布尔类型,为True时,凸包角点将按顺时针方向排列;为False时,为逆时针。


returnPoints:布尔类型,默认值True,函数返回凸包角点的x/y坐标;为False时,函数返回轮廓中凸包角点的索引。


获取凸包角点


既然,我们已经了解了凸包的作用,并且理解了OpenCV提供的函数。下面,我们随便选取一张图,获取凸包角点。具体代码如下所示:

import cv2
img = cv2.imread("24.jpg")
cv2.imshow("img", img)
# 转换为灰度图像
gray = cv2.cvtColor(img, 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])
print(hull)


这里,我们随便获取了一张图像,并获取其凸包的角点。运行之后,角点坐标如下:


如果修改参数returnPoints为False,会返回对应的6个索引值。


这里我们再添加一行代码就可以绘制凸包多边形了,具体添加的代码如下:

#获取hull之后
cv2.polylines(img, [hull], True, (0, 255, 0), 2)
cv2.imshow("img1", img)


运行之后,效果如下所示:


凸缺陷


凸包与轮廓之间的部分我们称之为凸缺陷。在OpenCV中使用函数cv2.convexityDefects()获取凸缺陷,其完整定义如下:

def convexityDefects(contour, convexhull, convexityDefects=None): 

contour:轮廓


convexhull:凸包


convexityDefects:返回值,为凸缺陷点集。它是一个数组,返回的指包括[起点,终点,轮廓上的距离凸包最远点,最远点到凸包的近似距离]


特别注意,用该函数计算凸缺陷之前,我们需要使用函数cv2.convexHull()获取凸包,但其参数returnPoints必须为False。


下面,我们来使用该函数计算上图的凸缺陷。代码如下:

import cv2
img = cv2.imread("24.jpg")
cv2.imshow("img", img)
# 转换为灰度图像
gray = cv2.cvtColor(img, 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], returnPoints=False)
defects = cv2.convexityDefects(contours[0], hull)
print(defects)
for i in range(defects.shape[0]):
    s, e, f, d = defects[i, 0]
    start = tuple(contours[0][s][0])
    end = tuple(contours[0][e][0])
    far = tuple(contours[0][f][0])
    cv2.line(img, start, end, [0, 255, 0], 2)
    cv2.circle(img, far, 5, [0, 0, 255], -1)
cv2.imshow("img1", img)
cv2.waitKey()
cv2.destroyAllWindows()


运行之后,效果如下:


如上图所示,我们用点标记出来的凸缺陷,可以看到五角星的每个凹肩都是凸缺陷。


最后可以扩展以下,其中OpenCV提供函数cv2.isContourConvex()来判断轮廓是否是凸形的。同时,也提供了cv2.pointPolygonTest()函数来计算点到多边形(轮廓)的最短距离,也就是垂线距离,这个计算由称为点和多边形的关系测试。感兴趣的读者可以自己实验这两个方函数。

相关文章
|
数据采集 存储 XML
深入浅出:基于Python的网络数据爬虫开发指南
【2月更文挑战第23天】 在数字时代,数据已成为新的石油。企业和个人都寻求通过各种手段获取互联网上的宝贵信息。本文将深入探讨网络爬虫的构建与优化,一种自动化工具,用于从网页上抓取并提取大量数据。我们将重点介绍Python语言中的相关库和技术,以及如何高效、合法地收集网络数据。文章不仅为初学者提供入门指导,也为有经验的开发者提供进阶技巧,确保读者能够在遵守网络伦理和法规的前提下,充分利用网络数据资源。
|
计算机视觉 Python
OpenCV轮廓拟合与凸包的讲解与实战应用(附Python源码)
OpenCV轮廓拟合与凸包的讲解与实战应用(附Python源码)
456 0
|
机器学习/深度学习 XML 搜索推荐
图像自动化保存工具:Python脚本开发指南
图像自动化保存工具:Python脚本开发指南
|
数据采集 JavaScript 前端开发
Web爬虫开发指南:使用Python的BeautifulSoup和Requests库
Web爬虫是一种从互联网上获取数据的自动化工具,它可以用于抓取网页内容、提取信息和分析数据。Python提供了一些强大的库,其中BeautifulSoup和Requests是两个常用的工具,用于解析HTML内容和发起HTTP请求。本文将介绍如何使用BeautifulSoup和Requests库构建一个简单而有效的Web爬虫。
|
前端开发 API 数据库
Python网站开发指南:构建现代化、高效的Web应用
在当今数字化时代,网站已成为企业、组织以及个人展示自己的重要窗口。Python作为一种简洁、高效且易于学习的编程语言,被广泛运用于网站开发领域。本文将向您介绍如何使用Python进行网站开发,包括常用的Web框架、关键技术和最佳实践。
|
安全 小程序 程序员
屏幕录制与GIF转换---OpenCV-Python开发指南(46)
屏幕录制与GIF转换---OpenCV-Python开发指南(46)
317 2
屏幕录制与GIF转换---OpenCV-Python开发指南(46)
|
计算机视觉
实现抖音时光倒流效果---OpenCV-Python开发指南(56)
实现抖音时光倒流效果---OpenCV-Python开发指南(56)
334 1
实现抖音时光倒流效果---OpenCV-Python开发指南(56)
|
机器学习/深度学习 算法 Python
求凸包的周长-python
求凸包的周长-python
117 0
|
计算机视觉
实现抖音慢动作效果---OpenCV-Python开发指南(57)
实现抖音慢动作效果---OpenCV-Python开发指南(57)
352 1
|
算法
实现人脸美白算法---OpenCV-Python开发指南(59)
实现人脸美白算法---OpenCV-Python开发指南(59)
976 0
实现人脸美白算法---OpenCV-Python开发指南(59)

热门文章

最新文章

推荐镜像

更多