OpenCV-轮廓特征

news2024/11/17 15:32:42

文章目录

  • 一、简介
    • 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.coloradmin.cn/o/2119732.html

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

相关文章

纷享销客CRM+契约锁:“好应用+电子签” 融合领先实践

9月6日,主题为“智享未来 领创CRM新纪元”的2024纷享销客伙伴大会湖北站圆满结束,此次盛会吸引了来自不同行业的精英代表、技术专家,共同探讨CRM领域的最新趋势、创新实践与未来机遇。纷享销客战略伙伴契约锁受邀参加本次大会,为现…

一区霜冰算法+双向深度学习模型+注意力机制!RIME-BiTCN-BiGRU-Attention

一区霜冰算法双向深度学习模型注意力机制!RIME-BiTCN-BiGRU-Attention 目录 一区霜冰算法双向深度学习模型注意力机制!RIME-BiTCN-BiGRU-Attention效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现RIME-BiTCN-BiGRU-Attention霜冰算法…

NLP-新词挖掘

一、背景 网络领域的新词发现(挖掘)是一个非常重要的nlp课题。在处理文本对象时,非常关键的问题在于“切词”这个环节,几乎所有的后续结果都依赖第一步的切词。因此切词的准确性在很大程度上影响着后续的处理,切词结果…

树莓派通过串口驱动SU-03T语音模块

树莓派通过串口驱动SU-03T语音模块 文章目录 树莓派通过串口驱动SU-03T语音模块一、SU-03T语音模块的配置和烧录1.1 PIN引脚配置:1.2 设置唤醒词:1.3 设置控制详情:1.4 下载SDK并烧录到语音模块: 二、测试语音模块三、树莓派通过串…

在这12种场景下会使Spring事务失效--注意防范

在某些业务场景下,如果一个请求中,需要同事写入多张表的数据,但为了保证操作的原子性(要么同事插入数据成功,要么同事插入失败),例如,当我们创建用户的时候,往往会给用户…

图的广度优先遍历与深度优先遍历(C语言)

这是结果 #include <stdio.h> #include <stdlib.h> #include <stdbool.h>#define _CRT_SECURE_NO_WARNINGS// 定义边表结点结构 typedef struct EdgeNode {int adjvex; // 邻接顶点域&#xff0c;存储该边所指向的顶点struct EdgeNode* next; // 指向下一条…

Oracle Linux 8.10安装Oracle19c(19.3.0)完整教程

安装前请仔细将文档通读一遍&#xff0c;安装过程中根据安装命令仔细核对&#xff0c;特别留意一些字体加粗或标红的字样&#xff0c;遇到问题请及时咨询公司 1、基础环境 1.1、操作系统 cat /etc/redhat-release 1.2、主机名 医院默认分配的主机名可能跟其他主机会有重复&a…

【阿里云】10分钟在网站上增加一个AI助手

文章目录 方案预览1. 创建大模型问答应用1.1 创建应用1.2 获取调用 API 所需的凭证 2. 搭建示例网站2.1 创建应用2.2 访问网站 3. 为网站增加 AI 助手3.1 增加 AI 助手相关代码3.2 验证网站上的 AI 助手 4. 为 AI 助手增加私有知识4.1 配置知识库 总结应用于生产环境前端代码服…

mysql使用笔记

1、下载mysql,本教程适用于免安装版。 https://dev.mysql.com/downloads/mysql/ 当前最新版本是8.0.27,如果想安装其他版本,选择Achives. 下载后减压到要放置的目录中。 E:\mysql-5.7.35-winx64 这是我的路径,在根目录下建立一个my.ini 文件,用来放置配置信息,保存的时候…

猫咪浮毛有这么严重?你不知道的浮毛清理好物——宠物空气净化器

家人们谁懂啊&#xff0c;男朋友整天和我家猫争宠&#xff0c;最近还上升到了有猫没他的地步。猫咪刚开始接回来的时候压根不掉毛&#xff0c;他们相处的特别好&#xff0c;呆在一起玩的时间比我还多。可是这样温馨的相处没持续多久就变了&#xff0c;之前不掉毛都是猫咪的假象…

MIST:用于组织病理学亚型预测的多实例选择性Transformer|文献速递--基于深度学习的医学影像病灶分割

Title 题目 MIST: Multi-instance selective transformer for histopathological subtype prediction MIST&#xff1a;用于组织病理学亚型预测的多实例选择性Transformer 01 文献速递介绍 组织病理学亚型预测在癌症疾病的诊断和治疗中具有重要的临床意义。组织病理学亚型…

反序列化漏洞练习1

根据代码可以看出来sis类只是接收了参数cmd&#xff0c;下边是通过get获得cmd的值&#xff0c;所以可以在序列化过程中直接为cmd赋值。 根据源码编写序列化代码 <?php class sis{public $cmdsystem("whoami");?>;public function __wakeup(){eval($this-&g…

记录深度学习量化操作

0. 简介 深度学习中做量化提升运行速度是最常用的方法&#xff0c;尤其是大模型这类非常吃GPU显存的方法。一般是高精度浮点数表示的网络权值以及激活值用低精度&#xff08;例如8比特定点&#xff09;来近似表示达到模型轻量化&#xff0c;加速深度学习模型推理&#xff0c;目…

选择网站服务器有哪几种类型?

许多用户往往对服务器托管、服务器租用、独享带宽、VPS租用、虚拟主机、云服务器等概念没有很知道&#xff0c;记不清怎样挑选IDC业务&#xff0c;有的一味的认为质量&#xff0c;挑选了费用较高的套餐&#xff0c;但是却浪费资源&#xff0c;没有必要&#xff0c;也有一些用户…

【鸿蒙 HarmonyOS NEXT】使用EventHub进行数据通信

✨本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✨踩坑不易&#xff0c;还希望各位大佬支持一下&#xff0c;在GitHub给我点个 Start ⭐⭐&#x1f44d;&#x1f44d; ✍GitHub开源项目地址&#x1f449;&#xff1a;https://github.com/cheinlu/groundhog-charging-syst…

【回收站选址】

题目 代码 #include <bits/stdc.h> using namespace std; const int R 2e91; typedef long long LL; unordered_set<LL> s; int piles[5]; int dx[4] {-1, 0, 1, 0}, dy[4] {0, 1, 0, -1}; int dx1[4] {-1, -1, 1, 1}, dy1[4] {-1, 1, -1, 1};bool check(LL …

找不到ucrtbased.dll无法继续执行代码怎么办,总结5个方法

当计算机系统提示找不到ucrtbased.dll文件时&#xff0c;可能会引发一系列运行问题和故障现象。首先&#xff0c;我们需要了解ucrtbased.dll究竟是什么以及它在操作系统中扮演的角色。ucrtbased.dll是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它是Microsoft …

树莓派通过串口驱动HC-08蓝牙模块

树莓派通过串口驱动HC-08蓝牙模块 文章目录 树莓派通过串口驱动HC-08蓝牙模块一、HC-08蓝牙模块介绍二、树莓派与蓝牙模块硬件连接三、树莓派通过蓝牙控制设备 一、HC-08蓝牙模块介绍 蓝牙模块&#xff0c;是一种集成的蓝牙功能的PCB板&#xff0c;用于短距离无线通信&#xff…

小而强大!零一万物 Yi-Coder 模型震撼发布!

前沿科技速递&#x1f680; 在 AI 迅速发展的今天&#xff0c;代码生成和编辑工具已经成为开发者们追求高效开发的重要利器。近日&#xff0c;零一万物正式开源了 Yi-Coder 系列模型&#xff0c;一个专为编程任务设计的强大工具&#xff0c;为开发者们带来了全新的生产力提升方…

记录|C#的软件图标更换

目录 前言一、软件界面的图标二、软件外的图标更新时间 前言 参考文章&#xff1a; 自己开发出的软件&#xff0c;肯定要更换图标&#xff0c;无论是软件打开前还是软件上的。如下图&#xff1a; 一、软件界面的图标 直接在Form的属性中进行icon的更换【如下图&#xff1a;】…