OpenCV 入门教程:轮廓特征和轮廓匹配

OpenCV 入门教程:轮廓特征和轮廓匹配

  • 导语
  • 一、轮廓特征
  • 二、轮廓匹配
  • 三、示例应用
    • 3.1 目标识别
    • 3.2 形状分析
  • 总结

导语

轮廓特征和轮廓匹配是图像处理中用于描述和比较轮廓的技术。通过提取轮廓的形状、面积、周长等特征,并进行比较和匹配,我们可以实现目标识别、形状分析等应用。在本文中,我们将以轮廓特征和轮廓匹配为中心,为你介绍使用 OpenCV 进行轮廓处理的基本步骤和实例。

😃😄 ❤️ ❤️ ❤️ ❤️ ❤️

一、轮廓特征

轮廓特征是指从轮廓中提取的描述性信息,用于对轮廓进行定量分析。以下是一些常见的轮廓特征:

1 面积( Area ):表示轮廓包围的区域的面积大小。
2 周长( Perimeter ):表示轮廓的边界长度。
3 边界框( Bounding Box ):表示能够完全包围轮廓的矩形框。
4 最小外接矩形( Minimum Enclosing Rectangle ):表示能够完全包围轮廓的最小矩形框。
5 最小外接圆( Minimum Enclosing Circle ):表示能够完全包围轮廓的最小圆。
6 中心点( Centroid ):表示轮廓的重心位置。

二、轮廓匹配

轮廓匹配是比较两个轮廓之间的相似度或差异度的技术。通过计算轮廓的形状、面积、周长等特征的差异,并进行比较,我们可以判断轮廓之间的相似性或不相似性。以下是一个使用轮廓匹配的示例代码:

import cv2

# 读取参考轮廓图像
reference_contour = cv2.imread('reference_contour.jpg', cv2.IMREAD_GRAYSCALE)

# 读取目标轮廓图像
target_contour = cv2.imread('target_contour.jpg', cv2.IMREAD_GRAYSCALE)

# 进行边缘检测
_, reference_edges = cv2.threshold(reference_contour, 127, 255, cv2.THRESH_BINARY)
_, target_edges = cv2.threshold(target_contour, 127, 255, cv2.THRESH_BINARY)

# 寻找轮廓
reference_contours, _ = cv2.findContours(reference_edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
target_contours, _ = cv2.findContours(target_edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 计算轮廓匹配
match = cv2.matchShapes(reference_contours[0], target_contours[0], cv2.CONTOURS_MATCH_I1)

在上述示例中,我们首先读取参考轮廓图像和目标轮廓图像,并通过边缘检测和轮廓寻找获取轮廓。然后,使用 matchShapes 函数计算轮廓之间的相似度。 CONTOURS_MATCH_I1 参数表示使用 I1 方法进行轮廓匹配。

三、示例应用

现在,我们来看一些常见的示例应用,演示轮廓特征和轮廓匹配的操作:

3.1 目标识别

使用轮廓特征和轮廓匹配可以实现目标识别,通过比较轮廓特征的相似度,判断是否存在目标对象。以下是一个示例代码:

import cv2

# 读取参考轮廓图像
reference_contour = cv2.imread('reference_contour.jpg', cv2.IMREAD_GRAYSCALE)

# 读取目标图像
target_image = cv2.imread('target_image.jpg')

# 进行边缘检测
_, reference_edges = cv2.threshold(reference_contour, 127, 255, cv2.THRESH_BINARY)
_, target_edges = cv2.threshold(target_image, 127, 255, cv2.THRESH_BINARY)

# 寻找轮廓
reference_contours, _ = cv2.findContours(reference_edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
target_contours, _ = cv2.findContours(target_edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 计算轮廓匹配
match = cv2.matchShapes(reference_contours[0], target_contours[0], cv2.CONTOURS_MATCH_I1)

# 判断目标是否存在
if match < 0.1:
    print("目标存在!")
else:
    print("目标不存在!")

这个示例将加载参考轮廓图像和目标图像,并通过边缘检测和轮廓匹配判断目标是否存在。

3.2 形状分析

使用轮廓特征可以进行形状分析,比如判断轮廓的形状类别或测量形状的尺寸。以下是一个示例代码:

import cv2

# 读取轮廓图像
contour_image = cv2.imread('contour_image.jpg', cv2.IMREAD_GRAYSCALE)

# 进行边缘检测
_, edges = cv2.threshold(contour_image, 127, 255, cv2.THRESH_BINARY)

# 寻找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 计算轮廓特征
for contour in contours:
    area = cv2.contourArea(contour)  # 计算轮廓面积
    perimeter = cv2.arcLength(contour, True)  # 计算轮廓周长
    bounding_rect = cv2.boundingRect(contour)  # 计算轮廓的边界矩形
    min_enclosing_circle = cv2.minEnclosingCircle(contour)  # 计算包围轮廓的最小圆
    centroid = (int(min_enclosing_circle[0][0]), int(min_enclosing_circle[0][1]))  # 计算轮廓的质心坐标

    # 在图像上绘制轮廓特征
    cv2.drawContours(contour_image, [contour], -1, (0, 255, 0), 2)  # 绘制轮廓线
    cv2.rectangle(contour_image, bounding_rect, (0, 0, 255), 2)  # 绘制边界矩形
    cv2.circle(contour_image, centroid, 5, (255, 0, 0), -1)  # 绘制质心圆

    # 在图像上显示轮廓特征信息
    cv2.putText(contour_image, f"Area: {area}", (bounding_rect[0], bounding_rect[1] - 10),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)  # 显示面积信息
    cv2.putText(contour_image, f"Perimeter: {perimeter}", (bounding_rect[0], bounding_rect[1] + bounding_rect[3] + 20),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5,(0, 0, 255), 2)  # 显示周长信息

# 显示带有轮廓特征的图像
cv2.imshow("Contours", contour_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

这个示例将加载轮廓图像,并通过边缘检测和轮廓特征计算轮廓的面积、周长、边界框、最小外接圆等,并在图像上绘制和显示轮廓特征。

总结

通过本文的介绍,你已经了解了使用 OpenCV 进行轮廓特征提取和轮廓匹配的基本步骤。你学会了使用 findContours 函数寻找轮廓,并通过计算轮廓的形状、面积、周长等特征进行轮廓匹配和形状分析。

轮廓特征和轮廓匹配是图像处理中常用的技术,可以应用于目标识别、形状分析等多个领域。通过提取轮廓特征并比较轮廓之间的相似度,我们可以实现对图像中目标区域的定量分析和比较。

[ 专栏推荐 ]
😃 《视觉探索:OpenCV 基础入门教程》😄
❤️【简介】:Opencv 入门课程适合初学者,旨在介绍 Opencv 库的基础知识和核心功能。课程包括图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪等内容。学员将通过学习基本操作和编程技巧,掌握 Opencv 在图像处理和计算机视觉任务中的应用。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python+Requests+Excel接口测试实战

1、EXCEL文件接口保存方式&#xff0c;如图。 2、然后就是读取EXCEL文件中的数据方法&#xff0c;如下&#xff1a; 1 import xlrd2 3 4 class readExcel(object):5 def __init__(self, path):6 self.path path7 8 property9 def getSheet(self): 10 …

flutter开发实战-Running Gradle task ‘assembleDebug‘ 的解决方法

flutter开发实战-Running Gradle task ‘assembleDebug‘ 的解决方法 使用Android studio经常出现Running Gradle task ‘assembleDebug‘问题&#xff0c;记录一下解决方法。 一、在Android目录下更改build.gradle 将repositories中的google(), mavenCentral() repositori…

从钢铁行业数字化管控平台的智能进化,看超自动化能力边界

文/王吉伟 钢铁行业的数字化转型&#xff0c;历来都是值得探讨的热点话题。 2022年&#xff0c;我国粗钢产量10.13亿吨&#xff0c;占据了全球钢铁供给市场的半壁江山。 这组数据可谓非常抢眼&#xff0c;但仍旧难掩诸多企业的各种经营问题。 钢铁生产过程工序众多&#xf…

计算机网络-网络层上篇

目录 一、网络层概述 二、网络层提供的两种服务 &#xff08;一&#xff09;面向连接的虚电路服务 &#xff08;二&#xff09;无连接的数据报服务 &#xff08;三&#xff09;虚电路服务与数据报服务的比较 三、IPv4地址及其应用 &#xff08;一&#xff09;IPv4地址概…

python中的生成器(generator)

一、生成器 生成器是 Python 中非常有用的一种数据类型&#xff0c;它可以让你在 Python 中更加高效地处理大量数据。生成器可以让你一次生成一个值&#xff0c;而不是一次生成一个序列&#xff0c;这样可以节省内存并提高性能 二、实现generator的两种方式 python中的gener…

SuperMap iClient3D for Cesium最短路径分析

作者&#xff1a;Mei 目录 前言实现思路实现步骤1、构建二维网络数据集1.1拓扑检查1.2线拓扑数据集处理1.3构建二维网络数据集 2、发布网络分析服务3、实现代码 前言 在交通、消防业务场景中&#xff0c;如果某地发生火灾或者交通事故&#xff0c;需要快速规划出最短抢救路线&a…

flask计算pin码

目录 Flask计算pin码 <1> 概念 什么是pin码&#xff1f; pin码生成条件&#xff1f; 读取相关文件绕过过滤 <2> 源码分析 werkzeug 1.0.x版本 计算PIN的源码 werkzeug 2.0.x版本 计算PIN的源码 <3> 计算生成pin的脚本 CTF中 flask-pin的应用 <1…

volatile原理剖析和实例讲解

一、是什么 volatile是Java的一个关键字&#xff0c;是Java提供的一种轻量级的同步机制&#xff0c; 二、能做什么 保证了不同线程对这个变量进行操作时的可见性&#xff0c;有序性。 三、可见性 可见性主要是指一个线程修改了共享变量的值&#xff0c;另一个线程可以看见…

RPC 框架架构设计

RPC 框架架构设计 RPC 又称远程过程调用&#xff08;Remote Procedure Call&#xff09;&#xff0c;用于解决分布式系统中服务之间的调用问题。通俗地讲&#xff0c;就是开发者能够像调用本地方法一样调用远程的服务。下面我们通过一幅图来说说 RPC 框架的基本架构。 RPC 框架…

Python_与redis数据库交互

目录 redis模块的使用 连接方式 连接池 操作 设置值 获取值 管道 事务 源码等资料获取方法 python可以使用redis模块来跟redis交互 redis模块的使用 安装模块: pip3 install redis 导入模块&#xff1a;import redis 连接方式 严格连接模式&#xff1a;rredis.St…

40.RocketMQ之高频面试题大全

消息中间件如何选型 RabbitMQ erlang开发&#xff0c;对消息堆积的支持并不好&#xff0c;当大量消息积压的时候&#xff0c;会导致 RabbitMQ 的性能急剧下降。每秒钟可以处理几万到十几万条消息。 RocketMQ java开发&#xff0c;面向互联网集群化功能丰富&#xff0c;对在线业…

Win10安全中心怎么关闭?Win10安全中心关闭方法

Win10安全中心怎么关闭&#xff1f;关闭Win10的安全中心可以帮助用户自定义系统的安全和防护设置&#xff0c;但有些用户不知道怎么操作才能关闭安全中心&#xff0c;首先用户需要打开Win10电脑的设置选项&#xff0c;接着打开安全中心&#xff0c;然后关掉安全中心的实时保护、…

SQL力扣练习(六)

目录 1. 部门工资前三高的所有员工(185) 题解一(dense_rank()窗口函数&#xff09; 题解二&#xff08;自定义函数&#xff09; 2.删除重复的电子邮箱(196) 题解一 题解二&#xff08;官方解析&#xff09; 3.上升的温度(197) 解法一&#xff08;DATEDIFF()&#xff09;…

非主流币波段策略

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

探究Vue源码:mustache模板引擎(5) 对比rollup与webpack,在本地搭建webpack环境

好 从本文开始 我们就来手写一下mustache这个库 他是模板引擎的一个祖先 将模板字符串编译成一个dom字符串 就是它的思想&#xff0c;这也是一个具有跨时代意义的思想 这里的话 我们还是搭一个 webpack 的项目环境 这里值得一提的是 mustache 他官方是通过rollup来进行打包的 …

【Docker】Docker的部署含服务和应用、多租环境、Linux内核的详细介绍

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

速通matplotlib库

速通matplotlib库 前言 ​ 最近在复习之前学习过的知识点&#xff0c;因此想到把学过的总结一下&#xff0c;方便后面再次复习&#xff0c;所以有了这个系列。 说明 ​ 由于标题写的是“速通”&#xff0c;因此我的想法是可以让大家看完这篇文章&#xff0c;可以上手matplotlib…

爬虫正常用哪种代理比较好?

目录 爬虫使用哪种代理IP 爬虫使用代理IP时需要考虑什么 爬虫怎么使用代理IP 爬虫使用代理IP示例代码 爬虫使用哪种代理IP 在使用代理IP进行爬虫时&#xff0c;以下几种类型的代理被认为是比较好的选择&#xff1a; 1. 高匿名代理&#xff1a;高匿名代理隐藏了真实的IP地址…

简要介绍 | 边缘计算:原理,研究现状与未来展望

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对边缘计算进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 边缘计算&#xff1a;原理&#xff0c;研究现状与未来展望 What is Edge Computing? | Moving Intelligence to the Edge 一、背景介…

漏刻有时数据可视化Echarts组件开发(27):端午地图粽情之你的家乡吃甜还是吃咸?

端午地图粽情之你的家乡吃甜还是吃咸&#xff1f; 前言Echarts创意来源Echarts核心代码1.引入外部文件2.构建HTML容器3.Echarts组件开发预置各省数据初始化DOM配置选项geo组件series组件自适应浏览器完整option选项配置代码 前言 中国各地对粽子的口味偏好存在一定的差异&…