【youcans 的 OpenCV 例程200篇】197.轮廓的基本特征

OpenCV 例程200篇 总目录-202205更新

文章目录

  • 【youcans 的 OpenCV 例程200篇】197.轮廓的基本特征
    • 2. 轮廓的特征描述
      • 2.2 轮廓的面积、周长、质心和近似多边形
        • 2.2.1 轮廓的面积
        • 2.2.2 轮廓的周长
        • 2.2.3 轮廓的质心
        • 2.2.4 轮廓的近似
        • 2.2.5 轮廓的凸包(凸壳)
      • 例程 12.4:轮廓的面积、周长、质心和近似多边形


【youcans 的 OpenCV 例程200篇】197.轮廓的基本特征


2. 轮廓的特征描述

在对实际图像进行轮廓查找时,得到的轮廓数量很多。获取轮廓后,通常基于轮廓的特征进行筛选、识别和处理。例如,基于轮廓的周长和面积对轮廓进行筛选,然后绘制筛选的目标轮廓或其最小外接矩形。

常用的轮廓特征,包括图像距、轮廓周长、轮廓近似、凸包、边界矩形、拟合图形等特征。


2.2 轮廓的面积、周长、质心和近似多边形

面积、周长、质心是常用的轮廓特征。


2.2.1 轮廓的面积

几何矩实质是面积或质量。函数 cv.moments() 的返回值 Moments[‘m00’] 表示轮廓面积。
轮廓的面积也可以使用函数 cv2.contourArea() 计算。

函数说明:

cv.contourArea(contour[, oriented]	) → retval
  • contour:顶点构成的二维向量组(如轮廓列表 contours 中的一个轮廓)
  • oriented:定向区域标志,默认值为 False,返回面积的绝对值,Ture 时则根据轮廓方向返回带符号的数值

2.2.2 轮廓的周长

轮廓的周长可以使用函数 cv2.arcLength() 计算。

函数说明:

cv.arcLength(curve, closed=True) → retval
  • curve:以顶点构成的二维向量组表示的曲线(如轮廓列表 contours 中的一个轮廓)
  • closed:曲线闭合标志,True 表示闭合曲线

2.2.3 轮廓的质心

轮廓的质心 (Cx,Cy) 可以通过一阶矩计算:
Cx=M10/M00Cy=M01/M00Cx = M_{10} / M_{00} \\ Cy = M_{01} / M_{00} Cx=M10/M00Cy=M01/M00


2.2.4 轮廓的近似

轮廓的近似是用顶点数量较少的多边形对轮廓进行近似,可以使用函数 cv2. approxPolyDP() 实现。近似多边形的边数取决于设定的最大近似距离。

函数说明:

cv.approxPolyDP(curve, epsilon, closed[, approxCurve]) → approxCurve
  • curve:以顶点构成的二维向量组表示的曲线(如轮廓列表 contours 中的一个轮廓)
  • approxCurve:近似多边形顶点坐标 (x,y) 的二维向量组
  • epsilon:近似精度,浮点数,原始曲线与近似多边形之间的最大距离
  • closed:曲线闭合标志,True 表示近似曲线是闭合的

2.2.5 轮廓的凸包(凸壳)

物体的凸包(凸壳)是指包含该物体的最小凸面体。在二维图像中凸壳可以想象为一条刚好包着所有点的橡皮圈。在凸壳与物体边缘之间的部分称为凸陷(Convexity defect)。

OpenCV 中的函数 cv.isContourConvex() 测试轮廓是否为凸面体,函数 cv.convexHull() 获取轮廓的凸壳 。

函数说明:

	cv.convexHull(points[, hull[, clockwise[, returnPoints]]]) → hullcv.isContourConvex(	contour) → retval

参数说明:

  • points:二维点向量集
  • contour:二维点向量集(如轮廓列表 contours 中的一个轮廓)
  • hull:输出凸包,凸包顶点的索引向量,或凸包顶点坐标 (x,y) 的二维向量组
  • clockwise:方向标志,默认值 False 表示逆时针方向输出凸包,True 为是顺时针
  • returnPoints:操作标志,默认值 True 表示返回凸包点集, False 返回凸包点的索引

注意事项:
函数 cv.isContourConvex() 测试轮廓是否为凸面,输入的轮廓必须没有自交叉线。
函数 cv.convexHull() 与函数 cv.drawContours() 配合,可以用来检测物体是否存在缺陷。


例程 12.4:轮廓的面积、周长、质心和近似多边形

    # 12.4 轮廓的面积、周长、质心和近似多边形img = cv2.imread("../images/seagull01.png", flags=1)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 灰度图像plt.figure(figsize=(9, 6))plt.subplot(231), plt.axis('off'), plt.title("Origin")plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))# HSV 色彩空间图像分割hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # 将图片转换到 HSV 色彩空间lowerBlue, upperBlue = np.array([100, 43, 46]), np.array([124, 255, 255])  # 蓝色阈值segment = cv2.inRange(hsv, lowerBlue, upperBlue)  # 背景色彩图像分割kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))  # (5, 5) 结构元binary = cv2.dilate(cv2.bitwise_not(segment), kernel=kernel, iterations=3)  # 图像膨胀plt.subplot(232), plt.axis('off'), plt.title("Tree contour")plt.imshow(binary, 'gray')# 寻找二值化图中的轮廓# binary, contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  # OpenCV3contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  # OpenCV4~print("len(contours) = ", len(contours))  # 所有轮廓的列表# #  绘制全部轮廓,contourIdx=-1 绘制全部轮廓for i in range(len(contours)):  # 绘制第 i 个轮廓if hierarchy[0][i][3]==-1:  # 最外层轮廓rect = cv2.minAreaRect(contours[i])  # 最小外接矩形x, y = int(rect[0][0]), int(rect[0][1])  # 最小外接矩形的中心(x,y)text = "{}:({},{})".format(i, x, y)img = cv2.drawContours(img, contours, i, (255, 255, 255), -1)  # 绘制第 i 个轮廓, 内部填充img = cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255))# print("i=", i, ",contours[i]:", contours[i].shape, ",hierarchy[0][i] =", hierarchy[0][i], "text=", text)plt.subplot(233), plt.axis('off'), plt.title("Contours")plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))# 轮廓的特征矩cnt = contours[0]  # 第 0 个轮廓moments = cv2.moments(cnt)  # 返回字典,几何矩 mpq, 中心矩 mupq 和归一化矩 nupqhuM = cv2.HuMoments(moments)  # 计算 Hu 不变矩# 轮廓面积area = cv2.contourArea(cnt)print("area by moments['m00']: ", moments['m00'])print("area of contour: ", area)# 轮廓的质心 (Cx, Cy)if moments['m00'] > 0:cx = round(moments['m10'] / moments['m00'])cy = round(moments['m01'] / moments['m00'])print("centroid of contour: ({}, {})".format(cx, cy))cv2.circle(img, (cx, cy), 5, (0, 0, 255), -1)  # 在轮廓的质心上绘制圆点plt.subplot(234), plt.axis('off'), plt.title("Contour centroid")plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))else:print("moments['m00'] = 0")# 轮廓的周长perimeter = cv2.arcLength(cnt, True)  # True  表示输入是闭合轮廓print("centroid of perimeter: {:.1f}".format(perimeter))# 轮廓近似多边形epsilon = 0.01 * cv2.arcLength(contours[1], True)approx = cv2.approxPolyDP(contours[1], epsilon, True)approx.shape:  (15, 1, 2)cv2.polylines(img, [approx], True, (0, 0, 255), 2)  # 绘制多边形plt.subplot(235), plt.axis('off'), plt.title("Approximate polygon")plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))# 检查轮廓是否为凸面体isConvex = cv2.isContourConvex(contours[2])  # True 凸面体, False 非凸print("contours[2] ContourConvex?", isConvex)# 获取轮廓的凸壳hull = cv2.convexHull(contours[2], returnPoints=True)  # 返回轮廓凸壳顶点坐标print("hull.shape: ", hull.shape)  # 凸壳顶点坐标 (x,y), (24, 1, 2)cv2.polylines(img, [hull], True, (0, 0, 255), 2)  # 绘制多边形plt.subplot(236), plt.axis('off'), plt.title("Contour convex")plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))plt.tight_layout()plt.show()

运行结果:

len(contours) =  6
area by moments['m00']:  15523.0
area of contour:  15523.0
centroid of contour: (394, 380)
centroid of perimeter: 783.5
approx.shape:  (15, 1, 2)
contours[2] ContourConvex? False
hull.shape:  (24, 1, 2)

在这里插入图片描述


(本节完)


版权声明:

youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125023990)

Copyright 2022 youcans, XUPT
Crated:2022-5-31


欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中

【youcans 的 OpenCV 例程200篇】194.寻找图像轮廓(cv.findContours)
【youcans 的 OpenCV 例程200篇】195.绘制图像轮廓(cv.drawContours)
【youcans 的 OpenCV 例程200篇】196.图像的矩和不变矩(cv.moments)
【youcans 的 OpenCV 例程200篇】197.轮廓的基本特征
【youcans 的 OpenCV 例程200篇】198.基于不变矩的形状相似性检测
【youcans 的 OpenCV 例程200篇】199.轮廓的外接边界框
【youcans 的 OpenCV 例程200篇】200.轮廓的基本属性
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Idea 项目导入

我们在刚开始使用新的开发工具IDEA的时候会遇到我们想要导入一个外部项目却不知从何下手,下面我就教给大家如何使用IDEA导入一个外部的项目。 Idea 导入 外部项目 1.点击 file — new 2.打开路径地址,选择需要导入的项目 3.选择创建—next 4.默认—…

【youcans 的 OpenCV 例程200篇】198.基于不变矩的形状相似性检测

OpenCV 例程200篇 总目录-202206更新 【youcans 的 OpenCV 例程200篇】198.基于不变矩的形状相似性检测 3. 基于不变矩检测的图像识别 形状匹配也称为形状相似度检测,用于比较两个形状或两个轮廓。 函数 cv2.matchShapes() 基于 Hu 不变矩检测两个形状之间的相似度…

spring boot 如何修改默认端口号和context path

创建了SpringBoot项目之后进行运行,当我们需要使用游览器进行访问的时候要输入端口号,那麽我们如何来修改这个端口号呢??? 1.在src/main/resources目录下新建文件application.properties,并进行配置,来重写…

【youcans 的 OpenCV 例程200篇】199.轮廓的外接边界框

OpenCV 例程200篇 总目录-202206更新 【youcans 的 OpenCV 例程200篇】199.轮廓的外接边界框 文章目录【youcans 的 OpenCV 例程200篇】199.轮廓的外接边界框2. 轮廓的特征描述2.3 轮廓的外接边界框2.3.1 轮廓的垂直矩形边界框2.3.2 轮廓的最小矩形边界框2.3.3 轮廓的最小外接圆…

单级联动

想要实现联动的效果首先我们要知道什么是单机联动,所谓的单级联动就是点击输入框的时候,下面会出现多个单级联动的列表供你选择自己所要选择的数据。 我们使用html写主题内容,使用CSS添加样式,使用Jquery实现联动等相关的事件和效…

【youcans 的 OpenCV 例程200篇】200.轮廓的基本属性

OpenCV 例程200篇 总目录-202206更新 文章目录【youcans 的 OpenCV 例程200篇】200.轮廓的基本属性2.4 轮廓的基本属性2.4.1 轮廓的宽高比(Aspect Ratio)2.4.2 轮廓的面积比(Extent)2.4.3 轮廓的坚实度(Solidity&#…

智能家居(1)行业发展分析

1 智能家居系统 智能家居是基于物联网技术,由硬件系统、软件系统、云计算平台构成一个家庭生态圈,为用户提供安全、便利、舒适的家居生活环境。 具体而言,智能家居以住宅为单位、以家庭生活为背景,以综合布线技术、网络通信技术…

redis 高级实用教程

一、设置redis外网访问 更改redis.conf 文件 # vim redis.conf bind 127.0.0.1 # 注释掉改行 protected-mode yes # 更改模式为no(redis3.2后)二、设置密码验证 更改redis.conf配置文件 requirepass redhat或者通过set设置 127.0.0.1:6284>…

LaTex实战笔记 4-插入 Python 程序代码块

LaTex插入 Python 程序代码块1. 需求描述和解决方案2. minted 包的安装与配置2.1 安装 Python 第三方库 Pygments2.2 下载和安装 minted 宏包2.3 配置 LaTeX 编译环境3. minted 包的使用3.1 基本使用3.2 扩展使用3.2.1 \mint 命令行3.2.2 \mintinline 行内使用3.2.3 \inputmint…

Redis 安装与配置

Redis 安装与配置 Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases。 这里我们下载 Redis-x64-xxx.zip 解压到指定目录:  打开命令行(cmd)跳转至解压路径,并运行安装命令,结果如图 C:\U…

智能家居(2)智能体验与智能交互

1. 智能体验的分析与讨论 随着信息和网络技术的发展,可以网络连接的电子电器产品越来越丰富,智能家居、智慧园区、智能汽车等智能控制系统和产品应用越来越广泛。 智能交互终端是智能控制系统的人机交互接口,既是实现智能功能的重要载体&am…

netbeans java9_Java 开发新选择?Apache NetBeans IDE 9.0 备受好评

Apache NetBeans 9.0 目前已发布 Beta 版本,离正式版本越来越近。9.0 版本的主要目标囊括 Oracle 捐赠的大量代码,以及提供 Java 9 和 10 支持。Apache NetBeans 近期在社区上发起了一项满意度调查,用于验收用户如何对 9.0 版本的看法&#x…

LaTex实战笔记 1-快速入门

LaTex插入 Python 程序代码块1. 为什么用 LaTeX?2. LaTeX 的安装与配置2.1 安装 TeXLive2.2 选择 LaTeX 编辑器3. LaTeX 的初次使用3.1 最短的 LaTeX 示例3.2 从模板创建文档3.3 编译生成 PDF 文件4. 基于模板编辑文档4.1 tex 模板的基本结构4.2 基于模板编辑排版5.…

java fx 皮肤_JavaFX 皮肤功能

作为RIA技术之一,为了让应用程序的界面看起来更加的漂亮或者更有个性,皮肤功能自然是必不可少的。在JavaFX中,可以使用CSS样式表来进行皮肤的更换。不过JavaFX中的CSS是基于W3C CSS version 2.1,但又不完全相同。JavaFX中的换肤有…

LaTex实战笔记 2-文档层次与结构

LaTeX 支持结构化文档的编写。 什么是结构化文档?会议论文、期刊论文、学位论文,这类有统一结构、统一版式的文档,是典型的结构化文档。而报刊文章的结构则因人而异,因文而异,是典型的非结构化文档。 1. 结构化文档的…

java爬取小说

使用Java爬取网站:http://www.shicimingju.com的小说内容 代码详解 1.在本地创建存储位置 2.编写正则表达式 3.循环获取内容 4.把内容存入文件夹中 5.判断成功或失败 效果演示 代码展示 package text;import java.io.BufferedReader;import java.io.BufferedWri…

智能家居(3)智能交互的竞品分析

智能家居系统与产品的交互方式,早已从物理按键、遥控操作发展为以触摸面板手机APP作为主要的交互方式,并已经实现了语音交互、生物识别等新技术的导入,未来可能会流行基于视觉的交互方式、基于机器学习的无感交互方式。融合这些交互方式的多模…

java爬取单张图片

我们经常需要在网页上获取一些图片,有的图片我们是可以直接下载使用,有的图片需要我们登陆账号甚至付费下载,所以在此我写了一个使用Java爬取任意网页单张图片的爬虫。 代码解析 1.图片的网络位置 2.进行访问和下载 3.建立本地存储位置 效果…

LaTex实战笔记 3-宏包与控制命令

1. LaTeX 命令的基本架构 LaTex 排版系统对于格式控制、公式编辑比 Word 更加灵活、准确。 Tex 环境中,字符、图片等各种文档内容都装在不同的盒子(box)容器内。这些盒子根据 Tex/Latex 的默认规则和控制命令组合为更大的盒子。字符组合为单…

【OpenCV 例程200篇】201. 图像的颜色空间转换

OpenCV 例程200篇 总目录 201. 图像的颜色空间转换 202. 查表快速替换(cv.LUT) 203. 伪彩色图像处理 204. 图像的色彩风格滤镜 205. 调节色彩平衡/饱和度/明度 文章目录【youcans 的 OpenCV 例程200篇】201. 图像的颜色空间转换图像的色彩空间基础图像的…