当前位置: 首页 > news >正文

探秘OpenCV中的findContours函数

文章目录

  • 导言
  • findContours函数的作用
    • 函数原型
    • 原理分析
  • 应用场景
  • 代码示例
  • 结语

导言

在计算机视觉领域,图像处理是一项重要的任务。而在图像处理的过程中,轮廓(Contours)的提取是一项基础且关键的操作。OpenCV库中的findContours函数就是用于找到图像中的轮廓的工具之一。本文将深入介绍findContours函数的作用、原理、应用场景,并结合C++和OpenCV提供一些简单的示例代码,方便读者入门。

findContours函数的作用

findContours函数的主要作用是在二值化图像中找到轮廓,这些轮廓是由相邻的像素组成的对象的边界。该函数能够识别并返回图像中所有的轮廓,并以一种易于处理的数据结构存储。
findContours函数详解
findContours是OpenCV中用于在二值化图像中查找轮廓的函数之一。下面详细介绍该函数的原型及参数作用。

函数原型

void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point());

参数说明
image:输入输出参数,是二值化的源图像。在函数执行后,该图像可能会被修改,以强调轮廓。注意,输入图像必须是8位单通道图像。

contours:输出参数,存储找到的轮廓的容器。它是一个向量的向量(vector<vector>),每个元素都代表一个轮廓,其中每个Point表示轮廓上的一个点。

hierarchy:输出参数,用于存储轮廓的层级信息。它是一个向量,每个元素包含了关于一个轮廓的层级关系,包括下一个轮廓、上一个轮廓、子轮廓和父轮廓的索引。

mode:表示轮廓的检索模式,是一个整数值。常见的模式有:

RETR_EXTERNAL:只检索最外层的轮廓。
RETR_LIST:检索所有轮廓并存储为列表。
RETR_CCOMP:检索所有轮廓并组织为两层的层级结构。
RETR_TREE:检索所有轮廓并完整重构轮廓层级。
method:表示轮廓的逼近方法,同样是一个整数值。常见的方法有:

CHAIN_APPROX_NONE:存储所有的轮廓点,不进行任何压缩。
CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角方向,只保留终点。
CHAIN_APPROX_TC89_L1和CHAIN_APPROX_TC89_KCOS:应用 Teh-Chin 链逼近算法。
offset:可选参数,表示轮廓中所有点的偏移。默认为Point(),即无偏移。

函数作用
findContours函数的主要作用是根据给定的模式和方法,在二值化图像中找到并提取轮廓。以下是各参数的作用:

image:作为输入,传入函数的二值化图像。

contours:作为输出,包含找到的轮廓信息。

hierarchy:作为输出,包含了轮廓之间的关系信息,如子轮廓、父轮廓等。

mode:决定了轮廓的检索模式,即找到哪些轮廓。

method:决定了轮廓的逼近方法,即如何表示轮廓的形状。

offset:可选参数,用于指定轮廓中所有点的偏移。

通过使用findContours函数,我们可以方便地在图像中定位并提取感兴趣的对象轮廓,为后续的图像处理和分析提供了基础。

原理分析

findContours函数的工作原理主要基于图像的边缘检测和连接分析。它的实现步骤可以概括为以下几个步骤:

图像预处理:首先,输入图像通常需要进行二值化处理,将图像转换为黑白两色,以便更容易检测轮廓。

边缘检测:利用一些边缘检测算法(如Sobel、Canny等),找到图像中的边缘。

轮廓查找:根据边缘信息,找到轮廓的起点,并按照一定规则遍历整个轮廓,将轮廓上的点存储起来。

轮廓连接:将相邻的轮廓点连接成完整的轮廓。

存储结果:将找到的轮廓以一种数据结构(通常是向量)存储,以便后续使用。

应用场景

findContours函数在许多计算机视觉任务中都得到广泛应用,例如:

目标检测:用于识别图像中的物体轮廓,从而进行目标检测。

图像分割:通过轮廓提取,可以将图像分割成不同的区域,有助于进一步的分析。

手写体识别:在手写体数字或字符识别中,findContours可以用于提取数字的轮廓。

医学图像分析:在医学图像中,该函数可用于分割和分析组织结构。

代码示例

使用C++与OpenCV写代码
以下是一个简单的C++代码示例,演示了如何使用OpenCV的findContours函数来查找并绘制图像中的轮廓:


#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main() {// 读取图像Mat image = imread("example.jpg", IMREAD_GRAYSCALE);if (image.empty()) {cerr << "Unable to read the image" << endl;return -1;}// 二值化图像Mat binaryImage;threshold(image, binaryImage, 128, 255, THRESH_BINARY);// 查找轮廓vector<vector<Point>> contours;vector<Vec4i> hierarchy;findContours(binaryImage, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);// 绘制轮廓Mat contourImage = Mat::zeros(image.size(), CV_8UC3);drawContours(contourImage, contours, -1, Scalar(0, 255, 0), 2);// 显示原始图像和带有轮廓的图像imshow("Original Image", image);imshow("Contours", contourImage);waitKey(0);return 0;
}

在这个示例中,首先读取一幅灰度图像,然后通过二值化处理。接着使用findContours函数找到图像中的轮廓,最后使用drawContours函数将轮廓绘制在一张空白图像上。最终,通过OpenCV的imshow函数显示原始图像和包含轮廓的图像。

结语

通过findContours函数,我们能够方便地在图像中找到并提取出对象的轮廓,为后续的图像处理和分析提供了基础。希望通过本文的介绍和代码示例,读者能够更好地理解并运用这一强大的函数。

相关文章:

探秘OpenCV中的findContours函数

文章目录 导言findContours函数的作用函数原型原理分析 应用场景代码示例结语 导言 在计算机视觉领域&#xff0c;图像处理是一项重要的任务。而在图像处理的过程中&#xff0c;轮廓&#xff08;Contours&#xff09;的提取是一项基础且关键的操作。OpenCV库中的findContours函…...

iOS 17.2更新:15Pro支持拍摄空间视频!

苹果又为开发者预览版用户推送了iOS 17.2 Beta2测试版的更新&#xff0c;已经注册Apple Beta版软件计划的用户只需打开设置--通用--软件更新即可在线OTA升级至最新的iOS 17.2测试版。 本次更新包大小为750M左右&#xff0c;内部版本号为&#xff08;21C5040g&#xff09;&#…...

keep-alive缓存,三级路由不生效

此文章讲诉在vue中使用keep-alive缓存&#xff0c;三级路由缓存失败处理方案。 一二级路由缓存无任何问题&#xff0c;三级以上就会失败&#xff0c;因此我们在路由守卫中对matched做出如下优化 Router.beforeEach((to, from, next)>{if(to.matched && to.matched.l…...

从Hadoop到对象存储,抛弃Hadoop,数据湖才能重获新生?

Hadoop与数据湖的关系 1、Hadoop时代的落幕2、Databricks和Snowflake做对了什么3、Hadoop与对象存储&#xff08;OSD&#xff09;4、Databricks与Snowflake为什么选择对象存储5、对象存储面临的挑战 1、Hadoop时代的落幕 十几年前&#xff0c;Hadoop是解决大规模数据分析的“白…...

电脑小Tip---外接键盘F1-F12快捷键与笔记本不同步

当笔记本外接一款非常好用的静音键盘后&#xff0c;会出现一些问题。例如&#xff1a;外接键盘F1-F12与笔记本不同步。具体一个例子就是&#xff0c;在运行matlab程序时&#xff0c;需要点编辑器—运行&#xff0c;这样就很麻烦&#xff0c;直接运行的快捷键是笔记本键盘上的F5…...

跨域:利用CORS实现跨域访问

跨域知识点&#xff1a;跨域知识点 iframe实现跨域的四种方式&#xff1a;iframe实现跨域 JSONP和WebSocket实现跨域&#xff1a;jsonp和websocket实现跨域 目录 cors介绍 简介 两种请求 简单请求 基本流程 withCredentials 属性 非简单请求 预检请求 预检请求的回应 …...

【Linux】Centos7 shell实现MySQL5.7 tar 一键安装

&#x1f984; 个人主页——&#x1f390;个人主页 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; 感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01;&…...

一步一步详细介绍如何使用 OpenCV 制作低成本立体相机

在这篇文章中,我们将学习如何创建定制的低成本立体相机(使用一对网络摄像头)并使用 OpenCV 捕获 3D 视频。我们提供 Python 和 C++ 代码。文末并附完整的免费代码下载链接 我们都喜欢观看上面所示的 3D 电影和视频。您需要如图 1 所示的红青色 3D 眼镜才能体验 3D 效果。它是…...

Zookeeper篇---第四篇

系列文章目录 文章目录 系列文章目录一、ZooKeeper 集群中个服务器之间是怎样通信的?二、ZooKeeper 分布式锁怎么实现的?三、了解Zookeeper的系统架构吗?一、ZooKeeper 集群中个服务器之间是怎样通信的? Leader 服务器会和每一个 Follower/Observer 服务器都建立 TCP 连接…...

Seata之TCC模式解读

目录 基本介绍 起源 概述 案例流程分析 TCC注意事项 空回滚 幂等 悬挂 具体使用 LocalTCC TwoPhaseBusinessAction 小结 基本介绍 起源 关于TCC的概念&#xff0c;最早是由Pat Helland于2007年发表的一篇名为《Life beyond Distributed Transactions:an Apost…...

算法--数据结构

这里写目录标题 本节内容链表与邻接表链表主要思想链表操作初始化在head结点后面插入普通插入删除操作 例子 双链表&#xff08;双向循环链表&#xff09;主要思想操作初始化双向插入删除第k个点 邻接表主要思想 栈和队列栈主要思想主要操作 队列主要思想操作 单调栈与单调队列…...

关系型数据库Redis安装与写入数据

文章目录 安装和初步选择数据库创建键值对数据类型 安装和初步 安装 Redis是开源的跨平台非关系型数据库&#xff0c;特点是占用资源低、查询速度快。 首先&#xff0c;在Github上下载最新发布的Redis-xxxx.zip压缩文件&#xff0c;下载之后解压&#xff0c;并将解压后的路径…...

《红蓝攻防对抗实战》十二.内网穿透之利用ICMP协议进行隧道穿透

内网穿透之利用ICMP协议进行隧道穿透 一.前言二.前文推荐三.利用ICMP协议进行隧道穿透1.ICMPsh获取反弹shell2.PingTunnel 搭建隧道 四.本篇总结 一.前言 本文介绍了利用ICMP协议进行隧道穿透的方法。ICMP协议不需要开放端口&#xff0c;可以将TCP/UDP数据封装到ICMP的Ping数据…...

【海德教育】国家开放大学和函授区别有:学校不同、入学门槛不同、学习方式不同、招生对象不同、学习年限不同,具体如下:

一、学校不同。 国家开放大学的招收学校是中央电大和各省市、自治州、市辖区及单设的国家开放大学。函授是成人高考学习方式&#xff0c;成考是普通高等院校举行的、单设的成人高等学校。 二、入学门槛不同。 国家开放大学对入学者的年龄、职业、地区和学习资历等方面都没有太多…...

单片机启动流程

存储器 ​ 一个单片机中存在rom和ram&#xff0c;Soc也有rom和ram&#xff08;ddrx&#xff09;&#xff0c;部分Soc还包含MMU&#xff08;Memory Manage Unit 内存管理单元&#xff09;— &#xff08;用于系统内存管理&#xff0c;比如说虚拟内存空间&#xff0c;内存区间的…...

Linux学习教程(第二章 Linux系统安装)2

第二章 Linux系统安装 四、使用U盘安装Linux系统 前面章节介绍了如何通过虚拟机 VMware 安装 Linux 系统&#xff0c;而实际开发中&#xff0c;我们更多的是要将 Linux 系统直接安装到电脑上。 直接在电脑上安装 Linux 系统的常用方法有 2 种&#xff0c;分别是用光盘安装和用…...

操作系统 | proc文件系统

&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《操作系统实验室》&#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 目录结构 1. 操作系统实验之proc文件系统 1.1 实验目的 1.2 实验内容 1.3 实验步骤 1.4 实验…...

刷题笔记(第五天)

1. 给定一个罗马数字&#xff0c;将其转换成整数。 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 …...

【OpenHarmony内核】Harmony内核互斥性信号量

文章目录 前言一、互斥性信号量是什么?二、互斥性信号量2.1 osSemaphoreNew函数创建并初始化一个信号量对象2.2 osSemaphoreGetName获取信号量对象的名称2.3 osSemaphoreAcquire获取一个信号量令牌2.4 osSemaphoreRelease2.5 osSemaphoreGetCount获取当前信号量令牌的数量2.6 …...

给OFFICE增加一个功能搜索

OFFICE功能几乎是无限的。不论你怎么熟悉&#xff0c;总有出乎意料的功能。前几天我使用EXCEL时&#xff0c;发现一个功能改名了。于是我就想&#xff0c;OFFICE应该增加一个功能搜索&#xff1a; 提供一个搜索输入栏。这个已经有了。输入搜索字串弹出一个面板&#xff0c;附带…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...