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 在图像处理和计算机视觉任务中的应用。
在这里插入图片描述

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

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

相关文章

Android 系统的分区介绍

由于Android系统采用Linux架构&#xff0c;所以Android的系统分区可以类比同样采用Linux架构的操作系统&#xff08;如Windows&#xff09;。 Android系统分区分类 现在一般常见的Android分区方式共有三种&#xff0c;在不同的Android系统版本上会采用不同的分区方式。 1、传…

应用级监控方案Spring Boot Admin

1.简介 Spring Boot Admin为项目常用的监控方式&#xff0c;可以动态的监控服务是否运行和运行的参数&#xff0c;如类的调用情况、流量等。其中分为server与client&#xff1a; server&#xff1a; 提供展示UI与监控服务。client&#xff1a;加入server&#xff0c;被监控的…

遥感云大数据在灾害、水体与湿地领域案例实践及GPT【洪涝灾害、洪水敏感性和风险模拟、河道轮廓监测、地下水变化、红树林遥感制图】

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

换零钱II:Python代码解Java题目

银行现存零钱面值种类动态变化但数量无限&#xff0c;类方法change()完成指定金额的最少零钱个数兑换。 (本笔记适合学透python基本数据结构&#xff0c;熟悉class的基构造&#xff0c;对类内全局变量有一定认的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1…

从CPU缓存结构到原子操作

文章目录 一、CPU缓存结构1.1 CPU的多级缓存1.2 Cache Line 二、写回策略三、缓存一致性问题及解决方案3.1 缓存一致性问题3.2 解决方案3.2.1 总线嗅探3.2.2 事务的串行化3.2.3 MESI 四、原子操作4.1 什么是原子操作4.2 c 标准库的原子类型4.2.1 atomic<T\>4.2.2 is_lock…

这款语音同声翻译软件为你提供智能翻译体验

林娜&#xff1a;嘿&#xff0c;你知道吗&#xff1f;现在有很多语音翻译软件可以帮助我们进行实时的语言翻译&#xff01; 罗伟&#xff1a;真的吗&#xff1f;有什么语音翻译软件呢&#xff1f;能告诉我一些详情吗&#xff1f; 林娜&#xff1a;当然&#xff0c;接下来我将…

SpringBoot+JWT实现单点登录解决方案

一、什么是单点登录? 单点登录是一种统一认证和授权机制&#xff0c;指在多个应用系统中&#xff0c;用户只需要登录一次就可以访问所有相互信任的系统&#xff0c;不需要重新登录验证。 单点登录一般用于互相授信的系统&#xff0c;实现单一位置登录&#xff0c;其他信任的…

AI热潮中的黑马:曾经的显卡制造商是如何跻身AI巨头之列的?

导读&#xff1a;在芯片行业的风云变幻中,英伟达如何从一家显卡制造商翻身成为AI巨头?面对行业迭代速度极快、激烈竞争和显著的高成本特点,英伟达是如何构建属于自己的护城河,又是如何突破技术瓶颈,跑在前列的呢?他们是如何将"摩尔定律"推进到更高阶段创造出属于自…

性能测试工具 Jmeter 测试 Dubbo 接口脚本编写

目录 前言&#xff1a; 1、背景 2、工具准备 3、创建一个 maven 项目&#xff0c;此处可以创建一个 quickstart&#xff0c;参考截图 4、以上配置完毕后&#xff0c;开始撸代码 5、上面那个类是不需要从 jmeter 中获取参数&#xff0c;如果要从 jmeter 中获取相关的参数&…

bio、nio、aio、io多路复用

BIO-同步阻塞IO NIO-同步非阻塞IO 不断的重复发起IO系统调用&#xff0c;这种不断的轮询&#xff0c;将会不断地询问内核&#xff0c;这将占用大量的 CPU 时间&#xff0c;系统资源利用率较低 IO多路复用模型-异步阻塞IO IO多路复用模型&#xff0c;就是通过一种新的系统调用&a…

实现跨语言互动:如何在Python中调用Java的JavaParser库解析Java源代码

1、背景 在多语言开发环境中&#xff0c;我们经常需要进行跨语言的操作。有时&#xff0c;我们可能会在Python环境下需要使用Java的库或者功能。这个博客将展示如何在Python中调用Java的JavaParser库来解析Java源代码。 2、需求 在许多软件开发场景中&#xff0c;我们可能需…

如何在MySQL中安装示例数据库sakila

就像 SQLServer 示例数据库一样,MySQL 也有示例数据库,比如sakila;Sakila 数据库最初由 MySQL AB 文档团队的前成员 Mike Hillyer 开发,旨在提供一个标准模式,可用于书籍、教程、文章、示例等中的示例,它包含示例视图、存储过程和触发器。 以下是在服务器上安装sakila数…