OpenCV(10): 轮廓近似—多边形拟合,边界矩形与边界圆形

这篇具有很好参考价值的文章主要介绍了OpenCV(10): 轮廓近似—多边形拟合,边界矩形与边界圆形。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

轮廓近似(Contour Approximation)是指对轮廓进行逼近或拟合,得到近似的轮廓。在图像处理中,轮廓表示了图像中物体的边界,因此轮廓近似可以用来描述和识别物体的形状。

多边形拟合

多边形拟合(Approximating Polygons)是将轮廓逼近成一个由直线段构成的多边形。常见的有最小包围矩形、最小包围圆形、最小二乘法椭圆等。使用 cv2.approxPolyDP() 函数可以实现多边形拟合。

轮廓近似可以减少轮廓点数,简化轮廓信息,为后续轮廓特征提取和物体识别等任务提供便利。

方法详解

approx = cv2.approxPolyDP(curve, epsilon, closed)

参数说明:

  • curve:输入轮廓。
  • epsilon:近似精度,即两个轮廓之间最大的欧式距离。该参数越小,得到的近似结果越接近实际轮廓;反之,得到的近似结果会更加粗略。
  • closed:布尔类型的参数,表示是否封闭轮廓。如果是 True,表示输入轮廓是封闭的,近似结果也会是封闭的;否则表示输入轮廓不是封闭的,近似结果也不会是封闭的。

返回值:

  • approx:近似结果,是一个ndarray 数组,包含了被近似出来的轮廓上的点的坐标。

需要注意的是,在使用 cv2.approxPolyDP() 函数之前,需要先使用 cv2.findContours() 函数对图像进行轮廓提取,从而得到输入轮廓。此外,当对轮廓进行近似时,需要根据具体场景选择合适的近似精度,这要根据实际需要来决定。

代码实操:

此次用的实验数据是这张图 :random.png ,我直接用画图软件瞎画的

OpenCV(10): 轮廓近似—多边形拟合,边界矩形与边界圆形

承接前文轮廓检测,首先把图像的轮廓搞出来,然后对轮廓进行拟合

import cv2
import numpy as np

#写一个方法用于展示图像,展示后按任意键继续下行代码
def cv_show(title,img):
    cv2.imshow(title,img)
    cv2.waitKey(0) 
    cv2.destroyAllWindows()
    return

img = cv2.imread('random.png')

#就是上一章的内容,具体就是会输出一个轮廓图像并返回一个轮廓数据
def draw_contour(img,color,width):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转换灰度图
    ret , binary = cv2.threshold(gray,10,255,cv2.THRESH_BINARY)#转换成二值图
    contour,hierarchy = cv2.findContours(binary, cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)#寻找轮廓,都储存在contour中
    copy = img.copy()
    resoult = cv2.drawContours(copy,contour[:],-1,color,width)
    cv_show('resoult',resoult)
    return contour


contour = draw_contour(img,(0,0,255),2)
print(type(contour))    
epsilon = 0.01*cv2.arcLength(contour[0],True)
approx = cv2.approxPolyDP(contour[0], epsilon, True)
print(type(approx),approx.shape)

res = cv2.drawContours(img.copy(),[approx],-1,(0,0,255),2)
cv_show('res',res)

在 draw_contour() 方法中,首先将彩色图像转换为灰度图像,然后通过 cv2.threshold() 函数将其转换为二值图像。接着,调用 cv2.findContours() 函数寻找图像中的轮廓,并使用 cv2.drawContours() 函数将轮廓绘制出来。最后返回得到的轮廓数据。

在主函数中,先调用 draw_contour() 方法获取图像的轮廓数据,然后通过 cv2.approxPolyDP() 函数对轮廓进行近似,并使用 cv2.drawContours() 函数绘制近似后的轮廓。最终再通过 cv_show() 方法展示结果。

需要注意的是,cv2.findContours() 函数返回的轮廓数据是一个包含所有轮廓的列表,因此在调用 cv2.approxPolyDP() 函数时需要选择要处理的轮廓,只能输入一个轮廓。这里测试图本身就一个轮廓所以直接切片[0]完事了。

结果:

OpenCV(10): 轮廓近似—多边形拟合,边界矩形与边界圆形OpenCV(10): 轮廓近似—多边形拟合,边界矩形与边界圆形

边界矩形

cv2.boundingRect() 函数是 OpenCV 中常用的一个函数,用于计算轮廓的垂直边界矩形(也称包围矩形或外接矩形)。

该函数的语法如下:

x, y, w, h = cv2.boundingRect(contour)

其中,contour 表示输入的轮廓数据,可以是一个单独的轮廓或者包含多个轮廓的列表。

返回值包含四个参数,分别表示矩形左上角点的 x 坐标、y 坐标以及矩形的宽度和高度。

在这个代码中,cv2.boundingRect() 函数被用于获取输入轮廓的边界矩形的位置与大小,返回值中的 xy 分别表示边界矩形左上角点的坐标,wh 分别表示矩形的宽度和高度。这一行代码将计算得到的边界矩形的位置和大小分别赋值给 xywh 四个变量。

代码实操:

此次用的测试图是这个:contour.png 也是我随便用画图工具画的

OpenCV(10): 轮廓近似—多边形拟合,边界矩形与边界圆形

 和多边形拟合类似,先算出边界,然后用cv2.boundingRect()计算边界矩形 

import cv2
import numpy as np

#写一个方法用于展示图像,展示后按任意键继续下行代码
def cv_show(title,img):
    cv2.imshow(title,img)
    cv2.waitKey(0) 
    cv2.destroyAllWindows()
    return

img = cv2.imread('contour.png')

def draw_contour(img,color,width):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转换灰度图
    ret , binary = cv2.threshold(gray,10,255,cv2.THRESH_BINARY)#转换成二值图
    contour,hierarchy = cv2.findContours(binary, cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)#寻找轮廓,都储存在contour中
    copy = img.copy()
    resoult = cv2.drawContours(copy,contour[:],-1,color,width)
    cv_show('resoult',resoult)
    return contour

contour = draw_contour(img,(0,255,255),2)
#print(np.array(contour).shape)

x,y,w,h = cv2.boundingRect(contour[0])
img_rectangle = cv2.rectangle(img.copy(),(x,y),(x+w,y+h),(255,255,0),2)
cv_show('img',img_rectangle)

这段代码中,调用 draw_contour() 方法获取图像的轮廓数据,并将其传递给 cv2.boundingRect() 函数计算得到轮廓的边界矩形位置和大小。然后,使用 cv2.rectangle() 函数在图像上绘制一个矩形,矩形左上角的坐标由 xy 指定,宽度和高度由 wh 指定,颜色为 (255, 255, 0),线条宽度为 2。最后使用 cv_show() 方法展示结果。

这里使用了 img.copy() 方法来复制原始图像,然后将矩形绘制在复制后的图像上。这样做可以防止直接修改原始图像;同时,使用复制后的图像展示结果也更加规范。

边界圆形

cv2.minEnclosingCircle() 是 OpenCV 中的一个函数,用于计算二维点集的最小外接圆。

函数原型为:

center, radius = cv2.minEnclosingCircle(points)

其中,points 参数为输入的二维点集,一般是一个 numpy 数组,形状为 (N,2)center 为输出的圆心坐标,形状为 (2,)radius 为输出的圆的半径。

该函数的实现原理是通过对输入的点集进行求解来获取能够覆盖所有点集的最小圆形。在实现过程中,该函数会利用旋转卡壳(Rotating Caliper)算法来寻找最小圆。

旋转卡壳算法是一种计算二维凸包及其性质的有效算法,在计算最小外接圆时也常常被使用。算法基本思路是首先计算出点集的凸包,然后在凸包边界上旋转两个切线,分别作为圆的直径,寻找最小的圆。

需要注意的是,cv2.minEnclosingCircle() 函数仅适用于二维点集,且在输入点集不完全符合条件时,该函数求得的最小外接圆可能并不是唯一的。

代码实操

import cv2
import numpy as np

#写一个方法用于展示图像,展示后按任意键继续下行代码
def cv_show(title,img):
    cv2.imshow(title,img)
    cv2.waitKey(0) 
    cv2.destroyAllWindows()
    return

img = cv2.imread('contour.png')

def draw_contour(img,color,width):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转换灰度图
    ret , binary = cv2.threshold(gray,10,255,cv2.THRESH_BINARY)#转换成二值图
    contour,hierarchy = cv2.findContours(binary, cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)#寻找轮廓,都储存在contour中
    copy = img.copy()
    resoult = cv2.drawContours(copy,contour[:],-1,color,width)
    cv_show('resoult',resoult)
    return contour

contour = draw_contour(img,(0,255,255),2)
print(np.array(contour).shape)

(x,y),radius = cv2.minEnclosingCircle(contour[0])
center = (int(x),int(y))
radius = int(radius)
img_circle = cv2.circle(img.copy(),center,radius,(25,0,255),2)
cv_show('img',img_circle)

使用 cv2.minEnclosingCircle() 函数计算轮廓 contour[0] 的最小外接圆,返回圆心坐标 (x, y) 和半径 radius,此方法只能输入一个边界。
将圆心坐标 (x, y) 转换为整型坐标 (int(x), int(y)),并将半径 radius 强制转换为整型。
使用 cv2.circle() 函数在原始图像的复制版本 img.copy() 上绘制一个圆形区域,圆心坐标为 (int(x), int(y)),半径为 radius,颜色为 (25, 0, 255)(BGR 格式),线条宽度为 2。
调用 cv_show() 函数展示绘制后的图像。

结果:

OpenCV(10): 轮廓近似—多边形拟合,边界矩形与边界圆形OpenCV(10): 轮廓近似—多边形拟合,边界矩形与边界圆形

注意,cv2.circle()和cv2.rectangle()一样会改变输入对象,所以要copy一下。文章来源地址https://www.toymoban.com/news/detail-496427.html

到了这里,关于OpenCV(10): 轮廓近似—多边形拟合,边界矩形与边界圆形的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【OpenCV 例程 300篇】223. 特征提取之多边形拟合(cv.approxPolyDP)

    【OpenCV 例程 300篇】223. 特征提取之多边形拟合(cv.approxPolyDP)

    『youcans 的 OpenCV 例程200篇 - 总目录』 目标特征的基本概念 通过图像分割获得多个区域,得到区域内的像素集合或区域边界像素集合。我们把感兴趣的人或物称为目标,目标所处的区域就是目标区域。 特征通常是针对于图像中的某个目标而言的。图像分割之后,还要对目标区

    2024年02月04日
    浏览(8)
  • cv2.approxPolyDP()函数的输出,为近似多边形的顶点坐标

    cv2.approxPolyDP()函数的输出,为近似多边形的顶点坐标

    原始图像为 经过轮廓检测,输出的Value值为cnt,类型为list,元素个数为11,即包含11个轮廓  c0为在cnt中索引为0,代表第一轮廓,即三角形轮廓    下面进行轮廓近似 cv2.apaproxPloyDP函数输出的approx,元素个数为3,即三角形三个顶点    

    2024年02月15日
    浏览(39)
  • 【计算几何】判断多边形边界顺逆时针 & C++代码实现

    【计算几何】判断多边形边界顺逆时针 & C++代码实现

    多边形可以由一个点集 { v 1 , v 2 , . . . , v n } {v_1,v_2,...,v_n} { v 1 ​ , v 2 ​ , ... , v n ​ } 表示,构成多边形的点集确定,多边形边界的顺序也就确定了 有关多边形边界的顺序的示意图,如下图所示: 有时候关于数据格式有规定,要求多边形边界必须为顺时针或者逆时针。 因

    2024年02月07日
    浏览(38)
  • cv2.approxPolyDP函数实现轮廓线的多边形逼近

    cv2.approxPolyDP函数实现轮廓线的多边形逼近

            实际项目需要拟合轮廓线,提取更贴合目标的四个点,于是找到了cv2.approxPolyDP函数。cv2.approxPolyDP() 使用了Douglas-Peucker算法,算法原理如下: 输入一组曲线点集合S,输出折线点集合T流程:         step1、设阈值thresh,取A的起点A和终点B加入T;         st

    2023年04月13日
    浏览(37)
  • 【3Ds Max】可编辑多边形“边界”层级的简单使用

    【3Ds Max】可编辑多边形“边界”层级的简单使用

    目录 示例 (1)挤出 (2)插入顶点 (3)切角 (4)利用所选内容创建图形 (5)封口 (6)桥 这里我们首先创建一个长方体,然后将其中键部分删除,形成上下底面缺失的长方体,这样就会有两个可选择的边界 (1)挤出 可以设置挤出的宽度和高度 (2)插入顶点 我们可以

    2024年02月11日
    浏览(41)
  • BoxPolyp:使用超粗边界框注释的提升广义多边形分割

    BoxPolyp:使用超粗边界框注释的提升广义多边形分割

    在本文中,提出了一种增强的BoxPolyp模型使用精确掩码和超粗框注释。在实践中,应用框注释来缓解先前息肉分割模型的过拟合问题,该模型通过迭代增强分割模型生成细粒度的息肉区域。 首先提出了一种融合滤波器采样(FFS)模块,用于从具有较少噪声的框注释中生成逐像

    2024年02月03日
    浏览(14)
  • opencv 之 外接多边形(矩形、圆、三角形、椭圆、多边形)使用详解

    opencv 之 外接多边形(矩形、圆、三角形、椭圆、多边形)使用详解

    本文主要讲述opencv中的外接多边形的使用: 多边形近似 外接矩形、最小外接矩形 最小外接圆 外接三角形 椭圆拟合 凸包 将重点讲述最小外接矩形的使用 给一个opencv官方的例程: 过程图像如下: 椭圆拟合一般用于轮廓提取之后: 凸包绘制 计算两个旋转矩形交集: C++版的最

    2024年02月09日
    浏览(103)
  • 基于C++ 的OpenCV绘制多边形,多边形多条边用不用的颜色绘制

    使用基于C++的OpenCV库来绘制多边形,并且为多边形的不同边使用不同的颜色,可以按照以下步骤进行操作: 首先,确保你已经安装了OpenCV库并配置好了你的开发环境。 导入必要的头文件: 创建一个空白的图像,然后绘制多边形,并为每条边选择不同的颜色: 在这个示例中,

    2024年02月13日
    浏览(38)
  • opencv 判断点在多边形内外

    opencv 判断点在多边形内外

            基于Python 和 OpenCV 画出多边形,以及判断某个点是不是在多边形内。         函数定义:cv2.pointPolygonTest(contour, pt, measureDist)         函数功能:找到图像里的点和轮廓之间的最短距离. 它返回的距离当点在轮廓外的时候是负值,当点在轮廓内是正值,如果

    2024年02月12日
    浏览(39)
  • python opencv 绘制矩形、圆、线、多边形

    python opencv 绘制矩形、圆、线、多边形

    👨‍💻 个人简介: 深度学习图像领域工作者 🎉 总结链接:              链接中主要是个人工作的总结,每个链接都是一些常用demo,代码直接复制运行即可。包括:                     📌 1.工作中常用深度学习脚本                     📌 2.to

    2024年02月03日
    浏览(160)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包