当前位置: 首页 > 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 语句对象…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

DiscuzX3.5发帖json api

参考文章&#xff1a;PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下&#xff0c;适配我自己的需求 有一个站点存在多个采集站&#xff0c;我想通过主站拿标题&#xff0c;采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…...

验证redis数据结构

一、功能验证 1.验证redis的数据结构&#xff08;如字符串、列表、哈希、集合、有序集合等&#xff09;是否按照预期工作。 2、常见的数据结构验证方法&#xff1a; ①字符串&#xff08;string&#xff09; 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数&#xff0c;如果我们没有定义实现某个中断函数&#xff0c;那么当stm32产生了该中断时&#xff0c;就会默认跑这里来了&#xff0c;所以我们打开了什么中断&#xff0c;一定要记得实现对应的系统中断函数&#xff0c;否则会进来一直循环…...