当前位置: 首页 > news >正文

【OpenCV实现图像找到轮廓的不同特征,就像面积,周长,质心,边界框等等。】

文章目录

    • 概要
    • 图像矩
    • 凸包
    • 边界矩形

概要

OpenCV是一个流行的计算机视觉库,它提供了许多图像处理和分析功能,其中包括查找图像中物体的轮廓。通过查找轮廓,可以提取许多有用的特征,如面积、周长、质心、边界框等。

以下是几种使用OpenCV查找轮廓时常见的特征:

面积:可以使用 cv2.contourArea() 函数计算轮廓的面积。该函数将轮廓作为输入,并返回浮点数表示轮廓的面积。

周长:可以使用 cv2.arcLength() 函数计算轮廓的周长。该函数将轮廓作为输入,并返回浮点数表示轮廓的周长。

质心:可以使用 cv2.moments() 函数计算轮廓的质心。该函数将轮廓作为输入,并返回一个字典,其中包含轮廓的各种矩形,包括轮廓的质心。

边界框:使用 cv2.boundingRect() 函数可以计算轮廓的边界框。该函数将轮廓作为输入,并返回一个元组,其中包括边界框的x和y坐标以及宽度和高度。

最小区域矩形:使用 cv2.minAreaRect() 函数可以计算轮廓的最小区域矩形。该函数将轮廓作为输入,并返回一个元组,其中包括矩形的中心坐标、宽度和高度以及角度。

最小外接圆:使用 cv2.minEnclosingCircle() 函数可以计算轮廓的最小外接圆。该函数将轮廓作为输入,并返回一个元组,其中包括圆心坐标和半径。

这些特征可以用于描述轮廓并提取有用的信息。例如,面积和周长可以用于分类和识别物体,质心可以用于跟踪物体的运动,边界框和最小区域矩形可以用于确定物体的位置和方向,最小外接圆可以用于确定物体的大小。

图像矩

图像矩可以帮助您计算一些特征,如物体的质心、物体的面积等。函数 cv.moments() 提供了一个计算出所有矩值的字典。代码如下:import numpy as np
import cv2 as cvimg = cv.imread('star.jpg', 0)
ret, thresh = cv.threshold(img, 127, 255, 0)
contours, hierarchy = cv.findContours(thresh, 1, 2)cnt = contours[0]
M = cv.moments(cnt)
print(M)

在这个M中,你可以提取有用的数据,如面积,质心等等。质心由如下关系式给出:
在这里插入图片描述
代码如下:

cx = int(M['m10'] / M['m00'])
cy = int(M['m01'] / M['m00'])

轮廓面积
轮廓面积可以通过函数 cv.contourArea() 或者是 M[‘m00’] 得到。

area = cv.contourArea(cnt)

轮廓周长
它也被称为弧长。它可以由函数 cv.arcLength() 得到。第二个参数需要指名形状是否闭合,闭合传入 True,否则传入 False。

perimeter = cv.arcLength(cnt, True)

轮廓近似
OpenCV中的approxPolyDP()函数是一个实现了Douglas-Peucker算法的轮廓近似函数。该函数可以将一个轮廓形状近似为另一个顶点数量较少的形状,精度取决于我们指定的参数epsilon。

例如,如果我们想要在图像中找到一个正方形,但由于图像中的噪声或其他因素,我们无法得到完美的正方形轮廓。此时,我们可以使用approxPolyDP()函数来近似轮廓形状,从而得到更接近真实形状的结果。在这种情况下,我们需要选择一个合适的epsilon值来控制近似精度。通常建议将epsilon设置为原始轮廓周长的一定比例,例如0.1*cv.arcLength(cnt, True)。

使用approxPolyDP()函数可以减少轮廓的顶点数量,从而提高图像处理和分析的效率和准确性。

epsilon = 0.1*cv.arcLength(cnt, True)
approx = cv.approxPolyDP(cnt, epsilon, True)

凸包

hull = cv.convexHull(points[, hull[, clockwise[, returnPoints]]])

参数详细信息:

•points 是我们穿过的轮廓。
•clockwise:方向标志。如果为True,则输出凸包的方向为顺时针方向。否则,其方向为逆时针方向。
•returnPoints:默认情况下为True。它会返回外壳点的坐标。如果为False,则返回与外壳点相对应的轮廓点的索引。

所以要得到上图中的凸包,以下就足够了:

hull = cv.convexHull(cnt)

但是,如果要查找凸性缺陷,则需要传递returnPoints=False。为了理解它,我们将拍摄上面的矩形图像。首先我发现它的轮廓是cnt。现在我找到了它的凸包,returnPoints=True,我得到了以下值:[[234 202]],[[51 202]],[[51 79]],[[234 79]],它们是矩形的四个角点。现在,如果returnPoints=False也这样做,我得到以下结果:[[129],[67],[0],[142]]。这些是等高线中对应点的索引。例如,检查第一个值:cnt[129]=[[234202]],该值与第一个结果相同(其他值依此类推)。

cv2.convexHull()函数的语法如下:

hull = cv2.convexHull(points[, hull[, clockwise[, returnPoints]]])

其中,参数的详细信息如下:

• points:表示我们要找凸包的轮廓。

• clockwise:方向标志。如果为True,则输出凸包的方向为顺时针方向;否则,其方向为逆时针方向。

• returnPoints:默认情况下为True。它会返回外壳点的坐标。如果为False,则返回与外壳点相对应的轮廓点的索引。

因此,如果我们只需要得到轮廓的凸包,则可以使用以下代码:

hull = cv2.convexHull(cnt)

但是,如果需要查找凸性缺陷,则需要将returnPoints设置为False。为了更好地理解其含义,考虑以下矩形图像。首先,我们找到了矩形的轮廓cnt。接着,我们使用returnPoints=True选项来计算其凸包,得到以下四个点的坐标值:[[234 202]],[[51 202]],[[51 79]],[[234 79]]。这些坐标值是矩形四个角的点。现在,如果我们将returnPoints设置为False,得到的将是以下四个点的索引值:[[129], [67], [0], [142]]。这些是轮廓数组中对应点的索引值。例如,第一个值129表示cnt[129]=[[234 202]],该值与前面求得的第一个凸包点的坐标值相同(其他索引值也类似)。

检查凸性
有一个函数可以检查曲线是否是凸的,cv.isContourConvex()。它只返回True或False。

k = cv.isContourConvex(cnt)

边界矩形

边界矩形是用于包围对象或轮廓的矩形形状。有两种类型的边界矩形:

7.a. 直边界矩形:
直边界矩形是一个简单的矩形,不考虑对象的旋转。它可以通过使用cv2.boundingRect()函数来找到。该函数返回一个四元组(x,y,w,h),其中(x,y)表示矩形左上角的坐标,(w,h)表示矩形的宽度和高度。

x, y, w, h = cv2.boundingRect(cnt)
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

以上代码将在图像img上绘制一个矩形,框住了轮廓cnt所代表的对象。

7.b. 旋转矩形:
旋转矩形是根据对象的最小面积绘制的矩形,并考虑了对象的旋转。要获得旋转矩形,可以使用cv2.minAreaRect()函数。该函数返回一个Box2D结构,其中包含矩形的中心坐标(x,y)、宽度和高度(w,h),以及旋转角度。

要绘制旋转矩形,我们需要得到矩形的四个角点。可以使用cv2.boxPoints()函数获得这些角点,该函数将旋转矩形作为参数,并返回一个数组包含四个角点的坐标。

rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(img, [box], 0, (0, 0, 255), 2)

以上代码将在图像img上绘制一个红色边界框,该边界框是根据轮廓cnt的最小面积旋转矩形计算而来。
最小外接圆

# 导入OpenCV库
import cv2 as cv# 使用cv.minEnclosingCircle()找到最小外接圆
(x, y), radius = cv.minEnclosingCircle(cnt)
center = (int(x), int(y))
radius = int(radius)# 在图像上绘制最小外接圆
cv.circle(img, center, radius, (0, 255, 0), 2)# 显示图像
cv.imshow('最小外接圆', img)

拟合椭圆

# 使用cv.fitEllipse()将椭圆拟合到对象上
ellipse = cv.fitEllipse(cnt)# 在图像上绘制拟合的椭圆
cv.ellipse(img, ellipse, (0, 255, 0), 2)# 显示图像
cv.imshow('拟合椭圆', img)

直线拟合

# 获取图像的行和列数
rows, cols = img.shape[:2]# 使用cv.fitLine()将直线拟合到一组点上
[vx, vy, x, y] = cv.fitLine(cnt, cv.DIST_L2, 0, 0.01, 0.01)
lefty = int((-x * vy / vx) + y)
righty = int(((cols - x) * vy / vx) + y)# 在图像上绘制拟合的直线
cv.line(img, (cols - 1, righty), (0, lefty), (0, 255, 0), 2)# 显示图像
cv.imshow('直线拟合', img)

在这里插入图片描述

相关文章:

【OpenCV实现图像找到轮廓的不同特征,就像面积,周长,质心,边界框等等。】

文章目录 概要图像矩凸包边界矩形 概要 OpenCV是一个流行的计算机视觉库,它提供了许多图像处理和分析功能,其中包括查找图像中物体的轮廓。通过查找轮廓,可以提取许多有用的特征,如面积、周长、质心、边界框等。 以下是几种使用…...

数仓建模—数仓建设概论

数仓建设概论 文章目录 数仓建设概论什么是数据仓库数据仓库对企业的意义1.全面掌握企业数据2.支持企业的决策制定3. 可靠性高怎么做数据仓库建1. 需求分析2. 设计数据仓库架构3. 数据采集4. 数据清洗5. 数据结构设计6. 数据分析7. 数据可视化8. 数据维护总结前面我们介绍了关于…...

Docker dnmp 多版本php安装 php8.2

Laravel9 开发需要用到php8.1以上的版本,而dnmp只支持到php8.0。安装php8.2的步骤如下: 1. 从/services/php80目录复制一份出来,重命名为php82,extensions目录只保留 install.sh 和 install-php-extensions 这两个文件 2. 修改.en…...

Distilling the Knowledge in a Neural Network【论文解析】

Distilling the Knowledge in a Neural Network 知识蒸馏 摘要1 引言摘要 提高几乎任何机器学习算法性能的一种非常简单的方法是在相同的数据上训练许多不同的模型,然后对它们的预测进行平均处理[3]。不幸的是,使用整个模型集合进行预测既繁琐又可能过于计算密集,特别是如果…...

基于深度学习的自动驾驶汽车语义分割与场景标注算法研究。

自动驾驶汽车是当前研究的热点领域之一,其中基于深度学习的语义分割与场景标注算法在自动驾驶汽车的视觉感知中具有重要作用。本文将围绕自动驾驶汽车的语义分割与场景标注算法展开研究。 一、研究背景 随着人工智能技术的不断发展,自动驾驶汽车逐渐成…...

国内可用超丝滑ChatGPT4.0(附网址及微信入口)

镜像网站的设置可以带来以下优势: 1.提高访问速度:由于镜像网站部署在全球不同的服务器上,用户可以从最近的服务器访问网站,从而减少延迟和提高加载速度。 2.增加可用性:如果主网站遭遇故障或网络拥堵,用…...

linux入门---线程的同步

目录标题 什么是同步生产者和消费者模型三者之间的关系消费者生产者模型改进生产者消费者模型特点条件变量的作用条件变量有关的函数条件变量的理解条件变量的使用 什么是同步 这里通过一个例子来带着大家了解一下什么是同步,在生活中大家肯定遇到过排队的情景比如…...

UI设计一定不能错过的4款常用工具

虽然设计审美很重要,但软件只是一种工具,但就像走楼梯和坐电梯到达顶层一样,电梯的效率显然更高,易于使用的设计工具也是如此。让我们了解一下UI设计的主流软件,以及如何选择合适的设计软件。 即时设计 软件介绍 即…...

JavaScript 基础 - 第2天

理解什么是流程控制,知道条件控制的种类并掌握其对应的语法规则,具备利用循环编写简易ATM取款机程序能力 运算符语句综合案例 运算符 算术运算符 数字是用来计算的,比如:乘法 * 、除法 / 、加法 、减法 - 等等,所以经…...

MyBatis和JDBC异同点

MyBatis和JDBC是两种不同的数据库访问技术,它们有以下几点区别: 抽象层级:JDBC(Java Database Connectivity)是Java提供的一种标准API,用于与数据库进行交互。它提供了一系列的接口和类,使开发人…...

关于yarn安装一些东西报错时的处理方法

The engine "node" is incompatible with this module. Expected version "^14.18.0 || ^16.14.0 || >18.0.0". Got "17.9.0"出现遮掩刮得错误时直接使用这个命令 yarn config set ignore-engines true 忽略错误就可以了 直接安装自己想安装…...

datagrip 使用自定义参数

两种使用方法: 1. 直接打问号❓,执行的时候会问你这个问号填什么 2. 设置参数,执行的时候会问你这个参数填什么 格式:${xxxx} xxxx是你定义的参数名字 SELECT ${column_name} FROM actor WHERE actor_id${actor_id} 执行就会问…...

css实现平行四边形按钮

当使用CSS实现平行四边形按钮时&#xff0c;可以使用transform属性和::before或::after伪元素来创建。下面是一个示例代码&#xff1a; <!DOCTYPE html> <html> <head> <style> .button {width: 150px;height: 50px;background-color: #4CAF50;color: …...

Jmeter只能做性能测试吗?

Jmeter除了可以性能测试&#xff0c;还能做接口测试 1、Jmeter和Fiddler&#xff0c;Postman有什么区别? Fiddler&#xff1a;虽然有接口测试功能&#xff0c;很少用来做接口测试。 一般用Fiddle来做抓包和异常测试&#xff0c;辅助接口测试。Postman&#xff1a; 是接口调试…...

Jmeter调用测试片段 —— 模块控制器

可以使用模块控制器调用测试片段。模块控制器提供了一种在运行时将测试片段替换为当前测试计划的机制。测试片段可以位于任何线程组中。 1、打开一个Jmeter窗口&#xff0c;添加好线程组、用户定义变量、模块控制器、测试片段、察看结果树。 2、用户定义变量同样定义好访问ip及…...

数组类型题目总结

跟着代码随想录的算法训练营进行训练 目前刷的数组 大部分都是需要遍历后 修改、移动、覆盖元素。 在不使用额外辅助空间的情况下&#xff1a; 在需要进行前后元素对比&#xff0c;使用双层for循环遍历的题目&#xff0c;有增删改查的操作时&#xff0c;就可以考虑使用双指针进…...

机器学习2:决策树--基于信息增益的ID3算法

1.决策树的简介 建立决策树的过程可以分为以下几个步骤: 计算每个特征的信息增益或信息增益比,选择最优的特征作为当前节点的划分标准。根据选择的特征将数据集划分为不同的子集。对每个子集递归执行步骤 1 和步骤 2,直到满足终止条件。构建决策树,并输出。基于信息增益的…...

centos7完全卸载和安装mysql8

问题描述 最近安装了MYSQL8&#xff0c;遇到了各种问题&#xff0c;总体汇总一下&#xff0c;凡是无法启动就是my.cnf和初始化的参数不匹配。 第一种 启动前设置了mysqld --initialize --usermysql --lower-case-table-names1&#xff0c;my.cnf文件却没有修改就去启动。 第…...

常用的解析XML的开源库

以下是一些常用的解析XML的开源库: DOM4J:DOM4J是一个基于Java的XML处理库,提供了DOM、SAX和StAX三种解析方式,可以解析和操作XML文档。它提供了丰富的API,可以用于生成、处理和解析XML文档。JAXB:JAXB是一个基于Java的XML处理库,它可以将Java对象映射到XML文档,也可以将XML文…...

SQLITE3 函数接口

简述 sqlite3 接口的核心元素: 两大对象&#xff0c;八大函数&#xff1b; 其中两个对象指的是: sqlite3 数据库连接对象 数据库的连接句柄(数据库的文件描述符) 代表你打开的那个 sqlite3 的数据库文件,后序对数据库的操作都需要用到这个对象 sqlite3_stmt SQL 语句对象…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...