OpenCV-轮廓特征

文章目录

  • 一、简介
    • 1.意义
    • 2.类别
  • 二、代码实现
    • 1.数据预处理
    • 2.计算周长
    • 3.绘制外接圆轮廓
    • 4.绘制外接矩阵
  • 三、总结

一、简介

1.意义

在OpenCV中,轮廓检测后得到的轮廓不仅是一系列点的集合,还可以进一步分析以提取有用的特征。这些特征包括但不限于轮廓的面积、周长、边界框、凸包、质心、方向、矩等。

2.类别

1.面积(Area):

  • 轮廓所包围区域的像素数。可以使用cv2.contourArea()函数计算。

2.周长(Perimeter)或弧长(Arc Length):

  • 轮廓边界的像素总数。虽然OpenCV没有直接提供计算周长的函数,但可以通过近似轮廓(如使用cv2.approxPolyDP())后计算其顶点间的距离总和来近似得到。

3.边界框(Bounding Rectangle):

  • 完全包含轮廓的最小矩形。可以是直角的(cv2.boundingRect()),也可以是旋转的(cv2.minAreaRect()),后者会给出矩形的中心、大小(宽度和高度)以及旋转角度。

4.最小外接圆(Minimum Enclosing Circle):

  • 完全包含轮廓的最小圆。可以使用cv2.minEnclosingCircle()函数找到。

5.凸包(Convex Hull):

  • 轮廓的凸包是包含轮廓所有点的最小凸多边形。可以使用cv2.convexHull()函数计算。

6.质心(Centroid):

  • 轮廓的几何中心或质心。对于二维图像,质心是一个点,表示轮廓的“平均”位置。可以通过矩(Moments)计算得到,cv2.moments()函数返回轮廓的矩,然后可以使用这些矩来计算质心。

7.方向(Orientation):

  • 轮廓的主要方向或角度。这通常通过计算轮廓的矩(如Hu矩)或使用其他形状描述符(如轮廓的拟合椭圆)来估计。

8.轮廓的近似(Contour Approximation):

  • 使用较少的点来近似表示轮廓,这有助于减少数据量和提高处理速度。可以使用cv2.approxPolyDP()函数进行轮廓的近似。

9.轮廓的矩(Moments):

  • 矩是形状描述符,可以用于计算轮廓的各种属性,如面积、质心、惯性矩等。cv2.moments()函数返回一个包含所有计算出的矩的字典。

10.拟合形状(Shape Fitting):

  • 可以使用不同的方法将轮廓拟合到基本形状(如圆形、椭圆形、多边形等)。这有助于进一步分析轮廓的形状特征。

二、代码实现

提取以上特征后,你可以根据它们进行进一步的图像处理、分析或识别任务。例如,你可以根据轮廓的面积和周长来过滤掉噪声或不需要的轮廓,或者根据轮廓的质心和方向来对齐或旋转图像。这里我们为大家举部分代码展示。

1.数据预处理

import cv2
phone = cv2.imread('sj.png')
phone_gray = cv2.cvtColor(phone,cv2.COLOR_BGR2GRAY)
cv2.imshow('phone_b',phone_gray)
cv2.waitKey(0)ret,phone_binary = cv2.threshold(phone_gray,120,255,cv2.THRESH_BINARY)
cv2.imshow('phone_binary',phone_binary)
cv2.waitKey(0)
_,contours,hierarchy = cv2.findContours(phone_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
print(hierarchy)
print(len(contours))
image_copy = phone.copy()
image_copy = cv2.drawContours(image=image_copy,contours=contours,contourIdx=-1,color=(0,255,0),thickness=3)
cv2.imshow('Contours_show',image_copy)
cv2.waitKey(0)

这段代码用于读取一张图片,将其转换为灰度图,应用二值化处理,然后查找并绘制轮廓,对图片处理之后方便我们进行后续提取特征。
在这里插入图片描述

2.计算周长

在代码中,使用了cv2.contourArea()函数来计算轮廓的面积,并且也使用了cv2.arcLength()函数来计算轮廓的周长(或称为弧长)。

area_0 = cv2.contourArea(contours[0])
area_1 = cv2.contourArea(contours[1])length = cv2.arcLength(contours[0],closed=True) # 周长
print(length)

轮廓索引:contours[0]和contours[1]分别表示找到的第一个和第二个轮廓。确保contours列表中有足够的元素,否则访问contours[1]可能会引发索引错误。
周长计算:cv2.arcLength()函数用于计算轮廓的周长或弧长。参数closed设置为True表示轮廓是闭合的,这对于大多数通过cv2.findContours()找到的轮廓是适用的。

3.绘制外接圆轮廓

cnt = contours[6]
(x, y), r = cv2.minEnclosingCircle(cnt) # 计算轮廓外接圆
phone_circle = cv2.circle(phone, (int(x), int(y)), int(r), (0, 255, 0), 2) # 绘制外接圆
cv2.imshow('phone_circle', phone_circle)
cv2.waitKey(0)

在代码中,正在从contours列表中获取第七个轮廓(索引为6,这里是铅笔的外接圆),并计算该轮廓的最小外接圆(如下图)。然后,在这个轮廓周围绘制一个绿色的圆来表示这个外接圆。
在这里插入图片描述

4.绘制外接矩阵

x, y, w, h = cv2.boundingRect(cnt) # 计算轮廓的外接矩阵
phone_rectangle = cv2.rectangle(phone, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow('phone_rectangle', phone_rectangle)
cv2.waitKey(0)
cv2.destroyAllWindows()

在代码中,使用cv2.boundingRect()函数来计算给定轮廓cnt的外接矩形(也称为边界框),并使用cv2.rectangle()函数在原始图像phone上绘制这个矩形。
在这里插入图片描述

三、总结

OpenCV中的轮廓特征提取和分析在计算机视觉领域具有许多重要的好处和应用。这些特征不仅可以帮助我们理解和分析图像内容,还能在图像识别、物体检测、形状分析、运动跟踪等多种场景中发挥关键作用。以下是一些OpenCV轮廓特征的主要好处:

  • 物体识别和定位:通过检测图像中的轮廓,可以识别和定位图像中的物体。轮廓是物体边界的精确表示,有助于区分不同的物体并确定它们的位置。
  • 形状分析:轮廓提供了物体的形状信息。通过分析轮廓的周长、面积、圆形度、矩等特征,可以对物体的形状进行分类和识别。例如,圆形轮廓可能代表一个球或车轮,而矩形轮廓可能代表一个书本或盒子。
  • 图像分割:轮廓检测是图像分割的一种重要方法。通过识别图像中的轮廓,可以将图像分割成不同的区域,每个区域对应一个物体或图像的一部分。这有助于后续的图像分析和处理。
  • 简化图像表示:轮廓提供了一种简洁的图像表示方式。相比于原始图像,轮廓仅包含物体的边界信息,大大减少了数据量。这种简化的表示方式有助于加快处理速度并降低存储需求。
  • 运动跟踪:在视频处理中,轮廓检测可以用于跟踪移动物体的位置和运动轨迹。通过连续检测图像序列中的轮廓,并计算它们之间的对应关系,可以实现对移动物体的实时跟踪。
  • 场景理解:通过提取和分析图像中的轮廓,可以帮助计算机理解场景的结构和布局。例如,在自动驾驶领域,通过检测道路上的轮廓,可以识别车道线、交通标志等关键信息,从而辅助车辆进行决策和导航。
  • 增强的鲁棒性:轮廓特征通常对光照变化、颜色变化等环境因素具有一定的鲁棒性。这意味着即使在不同的光照条件下或图像颜色发生变化时,仍然能够准确地检测和识别轮廓。

易于集成和扩展:OpenCV提供了丰富的轮廓检测和分析函数,这些函数易于与其他图像处理和分析技术集成。此外,OpenCV的开源特性使得开发者可以轻松地扩展和改进现有的轮廓处理算法。
综上所述,OpenCV的轮廓特征提取和分析在计算机视觉领域具有广泛的应用和重要的好处。它们不仅有助于我们理解和分析图像内容,还能为后续的图像处理和分析任务提供有力的支持。

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

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

相关文章

读书记录:谷歌工作法 工作效率提升10倍的57个技巧

​ 前言 我在谷歌工作时留下的最深刻印象是“必须以全世界最快的速度取得成果”这一谷歌特有的强烈的使命感。 为什么日本的企业生产效率低下 过度推迟讨论 过分讨论 过度的交流 改变工作方式方法才是生存之道 在这样的时代,我们不应该害怕“自己的工作消失”&a…

使用rsyslog转发自定义日志到指定服务器

rsyslog简介 rsyslog 是一个高度可配置的、功能强大的系统日志守护进程,广泛用于 UNIX 和 Linux 系统中。它是 syslog 的一个扩展版本,提供了许多额外的功能和改进。能够收集、过滤、存储和转发日志数据。它的灵活性和扩展性使其成为现代 Linux 系统中日…

点餐小程序实战教程04变量定义和初始化

目录 1 什么是变量2 如何创建变量3 具体该选择什么类型4 变量的初始化5 await/async6 调试我们的程序7 运行我们的代码总结 日常碰到的最多的一句话是,我看到代码就发憷,我一点基础也没有。那低代码开发需要掌握什么样的基础,怎么才算是掌握了…

C与汇编之间的相互调用(29)

1 先来看一下 基本的调用规则。 注意: 程序通过 r1 -r4 来保存 传递的参数,如果 超过了 4个参数怎么办, 那就 放到栈里面。 注意: 堆栈是满递减, FD。 子程序的返回结果 会放到R0 里面。 2 然后是 c 语言调用 汇编语言…

MongoDB 5.0版本副本集集群

一、MongoDB 5.0版本副本集集群部署 什么是MongoDB的副本集 MongoDB的副本集(Replica Set)是一种用于提高数据库系统可用性、可靠性和数据冗余性的机制。副本集包含一组相互连接的MongoDB节点,其中包括一个主节点(Primary&#…

使用FastJson2将对象转成JSON字符串时,小数转换出错

maven坐标 <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.40</version> </dependency> 问题现象&#xff1a; 问题原因&#xff1a; IOUtils.write…

SSM框架学习(二:SpringFramework实战指南)

目录 一、SpringFramework介绍 1.总体技术体系 &#xff08;1&#xff09;单一架构 &#xff08;2&#xff09; 分布式架构 2.Spring 和 SpringFramework概念 &#xff08;1&#xff09;广义的 Spring&#xff1a;Spring 技术栈&#xff08;全家桶&#xff09; &#xff…

基于IndexDB+md-editor-v3实现的简单的文章书写小系统

基于IndexDBmd-editor-v3实现的简单的文章书写小系统 文章说明核心代码效果展示源码下载 文章说明 采用vue3 IndexDB 实现的个人仓库系统&#xff0c;采用markdown书写文章&#xff0c;并将文章信息存储在IndexDB数据库中&#xff0c;通过JavaScript原生自带的分词API进行文章…

STM32——串口通信(发送/接收数据与中断函数应用)

文章目录 通信&#xff1a;串口通信简介&#xff1a;1.双工/单工&#xff1a;2.同步/异步&#xff1a;3.电平&#xff1a;电平标准&#xff1a; 串口参数以及数据帧时序&#xff1a;数据帧&#xff1a;1.波特率和比特率&#xff1a;例&#xff1a;无校验&#xff0c;1位停止位 …

【WebGIS实例】(16)GeoServer 自定义样式 - 渲染矢量数据

1. 前言 本篇博客将会分享一系列的 GeoServer 样式&#xff0c;通过这些样式预先在服务端完成数据渲染&#xff0c;让前端应用更便捷的加载数据服务。 2. 面矢量 示例数据&#xff1a; {type: FeatureCollection,features: [{type: Feature,properties: {分类字段: 字段一…

数据权限的设计与实现系列6——前端筛选器组件Everright-filter使用探索

linear 功能探索 最终我们是需要使用 API 的方式&#xff0c;调用后端服务拉取数据填充筛选器组件&#xff0c;不过在探索阶段&#xff0c;直接用 API 方式&#xff0c;就需要构造 mock 数据&#xff0c;比较麻烦&#xff0c;因此先使用 Function 方式来进行功能验证。 组件初…

代理模式详解

1.基本介绍 代理模式&#xff1a;为一个对象提供一个替身&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能;被代理的对象可以是远程对象、创建开销大的对象或需要安全控制…

记录:uniapp直播的弹幕的样式修改与发送弹幕会自动滚动到底部两个技巧

1、在直播页面的弹幕评论中&#xff0c;我们希望的样式是&#xff1a; 观众名字&#xff1a;评论 而且颜色有所区分&#xff0c;并在同一行显示 2、我们希望在发弹幕的时候可以回自动滚动到自己发的内容那里 一&#xff1a;弹幕样式修改 因为是小白&#xff0c;前端对于样式这…

苹果手机照片被删除?如何通过不同的方法来恢复照片

手机已经成为我们生活中不可或缺的一部分&#xff0c;它不仅仅是通讯工具&#xff0c;更是我们记录生活点滴的重要工具之一。然而&#xff0c;正如其他任何设备一样&#xff0c;iPhone上存储的照片有时也会不小心被删除或丢失。 别担心&#xff0c;即使你误删了重要的照片&…

重头开始嵌入式第三十四天(数据库二)

sqlite3的一些补充 目录 sqlite3的一些补充 1.事物 2.连接&#xff0c;联合 3.触发器 4.子查询 1.事物 数据库事务是数据库管理系统执行过程中的一个逻辑单位&#xff0c;它由一系列对数据库的操作组成。 一、事务的特性 1. 原子性&#xff08;Atomicity&#xff09…

Linux:目录及文件管理

目录及文件管理 cd的命令使用 . 当前目录 .. 父目录&#xff08;上一层&#xff09; ~ 表示家目录 家目录&#xff1a;专门存放用户个性化信息的目录 ~user&#xff1a;用户user的家目录 /root: 是Linux管理员的家目录 /home: 存放所有普通用户的家目录]# cd ~root #去…

大模型LLM算法工程师技术面试指南

大模型LLM算法工程师技术面试指南 AI大模型全套学习资料 “最先掌握AI的人&#xff0c;将会比较晚掌握AI的人有竞争优势”。 这句话&#xff0c;放在计算机、互联网、移动互联网的开局时期&#xff0c;都是一样的道理。 我在一线互联网企业工作十余年里&#xff0c;指导过不少…

Java异常类

目录 Java异常类 Java中的异常体系 抛出异常 处理异常 处理异常的两种方式 try...catch和throws的区别 finally关键字 抛出异常注意事项 自定义异常类 Java异常类 Java中的异常体系 在Java中&#xff0c;异常类的父类为Throwable类&#xff0c;在Throwable下&#x…

记一次高版本view-design的组件迁移到自身项目的低版本

背景 npm i -S view-design当前老项目使用view-design这个组件库&#xff0c;但是当我们去官网查看该组件库最新版本&#xff0c;竟然发现没有博主想用的image/ImagePreivew这两个基础组件 说实话&#xff0c;有点离谱了哈&#xff01;&#xff01; 自己造轮子&#xff1f; …

数据结构基本知识

一、什么是数据结构 1.1、组织存储数据 ---------》内存&#xff08;存储&#xff09; 1.2、研究目的 如何存储数据&#xff08;变量&#xff0c;数组....)程序数据结构算法 1.3、常见保存数据的方法 数组&#xff1a;保存自己的数据指针&#xff1a;是间接访问已经存在的…