C++:cv::findContours()说明

cv::findContours 是 OpenCV 库中一个非常重要的函数,用于在二值图像中查找轮廓。该函数可以检测图像中对象的边界,并返回这些轮廓的坐标信息,这些轮廓信息通常用于对象检测、分割和形状分析等任务。以下是对 cv::findContours 函数的详细介绍:

一、函数原型

在 C++ 接口中,cv::findContours 的函数原型通常如下:

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

二、参数说明

  1. image:输入的二值图像。这个函数通常在二值图像上操作,因此输入的图像应该是经过阈值处理后的图像,其中对象的像素值为255(白色),背景的像素值为0(黑色)。

  2. contours:用于存储检测到的轮廓的容器。这通常是一个 std::vector<std::vector<cv::Point>> 类型的变量,其中每个内部 vector<cv::Point> 表示一个轮廓,由一系列的点组成。

  3. hierarchy(可选):用于存储轮廓之间的层次结构信息的容器。这是一个可选参数,如果你不需要轮廓之间的层级关系,可以将其设置为空(不传递或使用默认值)。如果传递了这个参数,它将被填充为一个 std::vector<Vec4i> 类型的变量,其中每个 Vec4i 表示一个轮廓的层级信息,包括当前轮廓的下一个轮廓、前一个轮廓、第一个子轮廓和父轮廓的索引。

  4. mode:轮廓检索模式。这个参数决定了 cv::findContours 函数如何检索轮廓。常见的模式有:

    • cv::RETR_EXTERNAL:只检索最外层的轮廓。
    • cv::RETR_LIST:检索所有的轮廓,但不建立轮廓之间的等级关系。
    • cv::RETR_CCOMP:检索所有的轮廓,并将它们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界。
    • cv::RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次。
  5. method:轮廓近似方法。这个参数决定了轮廓的近似方式,以减少轮廓上的点的数量,从而提高处理速度。常见的方法有:

    • cv::CHAIN_APPROX_NONE:保存所有的轮廓点,不进行任何压缩。
    • cv::CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线方向的轮廓,只保留端点。
    • cv::CHAIN_APPROX_TC89_L1cv::CHAIN_APPROX_TC89_KCOS:使用Teh-Chin链近似算法的一种。
  6. offset(可选):轮廓点的偏移量。这是一个可选参数,默认为 cv::Point(0, 0),表示不进行偏移。当轮廓是从图像的某个区域(ROI)中提取的,并且需要在整个图像中分析时,这个参数将很有用。

三、返回值

cv::findContours 函数没有返回值(即返回类型为 void),但它通过修改传入的 contours 和(可选的)hierarchy 参数来输出轮廓和层级信息。

四、使用示例

以下是一个简单的使用 cv::findContours 函数的示例:

#include <opencv2/opencv.hpp>  int main() {  cv::Mat image = cv::imread("your_binary_image.jpg", cv::IMREAD_GRAYSCALE); // 加载二值图像  cv::Mat binary;  cv::threshold(image, binary, 128, 255, cv::THRESH_BINARY); // 确保图像是二值的  std::vector<std::vector<cv::Point>> contours;  std::vector<cv::Vec4i> hierarchy;  cv::findContours(binary, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);  // 在这里可以使用 contours 和 hierarchy 进行进一步的处理,比如绘制轮廓等  return 0;  
}

五、注意事项

  • 输入图像必须是二值图像,即图像中的像素值只能是0或255。
  • 轮廓检索模式和轮廓近似方法的选择取决于你的具体需求,不同的选择会影响轮廓的检测结果和处理速度。
  • 轮廓的层级信息(如果需要)提供了轮廓之间的父子关系,这对于分析嵌套轮廓非常有用。

通过 cv::findContours 函数,你可以轻松地在二值图像中检测对象的轮廓

在图像处理中,当您处理一个二值图像,其中黑色代表背景,白色代表物体时,确实,如果每个白色区域(即物体)在图像中是连续且未被打断的,那么通过findContours函数检测到的每个物体的轮廓通常是闭合的。这是因为findContours函数会沿着物体的边界(即白色到黑色的像素变化处)查找并返回轮廓点集,这些点集自然地形成了一个闭合的环,包围了物体的内部区域。

然而,需要注意的是,有几个因素可能会影响轮廓的闭合性:

  1. 图像噪声:如果图像中存在噪声,可能会导致物体边界上的像素值发生不必要的变化,这可能会干扰轮廓的闭合性。虽然这种影响可能很小,但在某些情况下可能需要通过图像预处理步骤(如滤波、去噪等)来减少噪声。

  2. 物体接触或重叠:如果图像中的物体相互接触或重叠,那么它们的轮廓可能会合并成一个更复杂的形状,这可能会使得单个物体的轮廓不再是完全闭合的。在这种情况下,您可能需要使用更复杂的图像处理技术(如分水岭算法、图割算法等)来分割和识别接触或重叠的物体。

  3. 二值化阈值:二值化过程中选择的阈值对轮廓的闭合性也有影响。如果阈值设置不当,可能会导致物体的内部出现空洞或物体的边界被切断,从而影响轮廓的闭合性。因此,选择合适的阈值对于获得准确的轮廓至关重要。

  4. 轮廓近似方法findContours函数允许您指定轮廓的近似方法。在某些情况下,为了减少轮廓上的点数以提高处理速度,可能会选择使用近似方法。然而,过度的近似可能会导致轮廓失去其原有的闭合性。因此,在选择近似方法时需要考虑其对轮廓闭合性的影响。

总的来说,在大多数情况下,如果图像中的物体是连续且未被打断的,并且图像处理步骤得当(如适当的二值化、滤波等),那么通过findContours函数检测到的物体轮廓通常是闭合的。然而,在处理复杂的图像时,可能需要考虑上述因素以确保获得准确的轮廓。

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

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

相关文章

多会话 Telnet 日志记录器

创建一个多会话 Telnet 日志记录器可以实现对多个 Telnet 会话进行连接、监控和记录日志。以下是一个基本的 Python 示例&#xff0c;使用 telnetlib 库来实现多会话 Telnet 日志记录器&#xff0c;并使用 threading 模块来处理多个会话。 1、问题背景 我们需要编写一个脚本&a…

Сетунь的24条单播指令

1、Setun模拟器概述 真的&#xff0c;想搞懂一台电脑是怎么运行的&#xff0c;那就搞懂它的指今集是怎么跑的&#xff0c;感觉很离了个大谱的&#xff0c;先看由铁氧体磁芯上的器件组成的RAM&#xff0c;容量为162个9-trit单元&#xff0c;即每个单元为9-trit&#xff0c;每页有…

【uni-app+Vue3】 API请求封装:让接口调用更便捷

前言&#xff1a;uni-app是一款基于Vue.js框架的跨平台开发工具&#xff0c;可以将代码编译成H5、小程序、App等不同平台的应用。在进行uni-app开发时&#xff0c;网络请求是必不可少的环节。为了方便开发&#xff0c;我们可以封装一些网络请求方法&#xff0c;以便在多个页面中…

About CAT7验证——CLASS F或者Fa测试FLUKE解决方案

七类CLASS F线缆认证测试标准在TIA的标准数据库中是直接跳过&#xff0c;取而代之的是八类的通道测试标准&#xff0c;真正认证七类测试的是在ISO标准数据库中&#xff0c;找到ISO11801 CHANNEL CLASS F或者FA&#xff0c;这就是标准的七类测试标准&#xff0c;测试频率需要达到…

Llama2 入门案例教学

Llama2 是一个基于 Python 的机器学习框架&#xff0c;旨在帮助开发者快速构建和部署机器学习模型。下面是 Llama2 的入门案例教程&#xff0c;旨在帮助您快速上手 Llama2。 安装 Llama2 首先&#xff0c;您需要安装 Llama2。可以使用 pip 安装&#xff1a; pip install lla…

一些学习网站分享

一些学习网站分享&#xff1a; ✅力扣(LeetCode) 力扣 (LeetCode) 官网 - 全球极客挚爱的技术成长平台 力扣是一个刷题站&#xff0c;支持C&#xff0c;Java&#xff0c;Python等多种编程语言&#xff0c;并按难度分为简单、中等、困难三个等级。是真的能刷到大厂真题 ✅Gith…

文本引导I2I迈向统一!北大王选所提出FCDiffusion:端到端适用于各种图像转换任务

文章链接&#xff1a;https://arxiv.org/pdf/2407.03006 github地址&#xff1a;https://github.com/XiangGao1102/FCDiffusion 最近&#xff0c;大规模的文本到图像(T2I)扩散模型在图像到图像(I2I)转换中展现出强大的能力&#xff0c;允许通过用户提供的文本提示进行开放域的图…

智能汽车网络安全笔记

汽车五大域 动力底盘、车身控制、智能座舱、智能网联和高级辅助驾驶五大域 国外汽车安全法规标准 汽车网络安全管理体系&#xff08;CSMS&#xff09; CSMS指的是管理汽车的网络威胁和风险&#xff0c;并保护车辆免受网络攻击的组织过程和管理系统 安全验证和安全测试 8…

安全保障措施

安全保障措施 项目的安全针对系统整体的安全设计提出有效的解决方案&#xff0c;确保系统安全接入&#xff0c;根据项目的特点&#xff0c;以及在网络运行中的安全进行分析&#xff0c;具体包含以下几个方面&#xff1a; 1、重要基础数据信息&#xff0c;比如涉及国家安全的数…

华为机考真题 -- 提取字符串中的最长合法简单数学表达式

题目描述: 提取字符串中的最长合法简单数学表达式,字符串长度最长的,并计算表达式的值。如果没有,则返回 0 。 简单数学表达式只能包含以下内容: 0-9数字,符号+-* 说明: 1、所有数字,计算结果都不超过long 2、如果有多个长度一样的,请返回第一个表达式的结果 3、数…

使用Vue实现前后端分离 spring框架返回json数据中文乱码

SpringBoot返回的中文显示???的问题_spring boot response 中文????-CSDN博客 引入js的script标签到底是放在head还是body中_html页面中用<script>标签引入js代码,该标签放在<head>标签中和放在<body>标签-CSDN博客 vue.js 的问答 - SegmentFault 思…

gyp ERR! stack import sys; print “%s.%s.%s“ % sys.version_info[:3];

这个错误信息是由node-gyp在尝试构建一个Node.js原生模块时发出的。它通常表示node-gyp工具无法正确安装或配置本地依赖。 错误解释&#xff1a; gyp ERR! stack 表示错误栈的开始。 import sys; print “%s.%s.%s” % sys.version_info[:3]; 是Python代码&#xff0c;用于打…

WritableStream()写入流,将数字或字符流,写入你需要的地方

WritableStream有两个对象参数&#xff1a; 第一个必选&#xff0c;用于配置一些写入流时的钩子&#xff1b; 第二个可选&#xff0c;用于配置一些chunk入队和队列控制的策略&#xff1b; 第二个参数的策略&#xff08;利用ByteLengthQueuingStrategy【按字节计量】和CountQueu…

gpt讲 Observable 对象

什么是 Observable&#xff1f; Observable 是一种用于处理异步数据流的数据类型。它可以发出多个值&#xff0c;这些值可以是同步或者异步产生的&#xff0c;并且可以在时间上发生变化。在 Angular 中&#xff0c;HttpClient 返回的响应对象、事件流以及许多其他异步任务都可…

网络服务器都包含哪些方面需要维护?

网络服务器是现代互联网架构中不可或缺的一部分&#xff0c;它们承载着数据存储、处理和传输的重要任务。为了确保服务器能够稳定、高效地运行&#xff0c;定期的维护工作显得尤为重要。下面将介绍一些常见的网络服务器维护方法&#xff1a; 定期更新软件和系统 保持操作系统和…

QGraphicsScene::itemAt和QGraphicsView::itemAt无法返回Item

坐标点确定是没问题的&#xff0c;就是item所在的位置 看源码&#xff0c;基于5.9.7 Src\qtbase\src\widgets\graphicsview\qgraphicsview.cpp QGraphicsItem *QGraphicsView::itemAt(const QPoint &pos) const {Q_D(const QGraphicsView);if (!d->scene)return 0;con…

ChatTTS使用

ChatTTS是一款适用于日常对话的生成式语音模型。 克隆仓库 git clone https://github.com/2noise/ChatTTS cd ChatTTS 使用 conda 安装 conda create -n chattts conda activate chattts pip install -r requirements.txt 安装完成后运行 下载模型并运行 python exampl…

Python面试题:请编写一个函数,计算一个字符串中每个字符的出现频率

当然&#xff0c;可以通过使用 Python 编写一个函数来计算字符串中每个字符的出现频率。下面是一个示例函数&#xff1a; def char_frequency(s):"""计算字符串中每个字符的出现频率参数:s (str): 输入字符串返回:dict: 一个字典&#xff0c;其中键是字符&…

java中方法的使用

方法的使用 方法的概念什么是方法方法定义方法的调用过程实参和形参的关系 方法重载为什么需要方法重载方法重载的概念方法签名 递归递归的概念递归过程分析递归练习 方法的概念 什么是方法 方法就是一个代码片段&#xff0c;类似于C语言的函数。 方法存在的意义&#xff1a;…

算法金 | 12 个最佳 Python 代码片段,帮我完成工作自动化,香~

​大侠幸会幸会&#xff0c;我是日更万日 算法金&#xff1b;0 基础跨行转算法&#xff0c;国内外多个算法比赛 Top&#xff1b;放弃 BAT Offer&#xff0c;成功上岸 AI 研究院 Leader&#xff1b; Python是一种多功能的编程语言&#xff0c;它提供了各种功能和库来有效地自动化…