OpenCV结构分析与形状描述符(10)检测并提取轮廓函数findContours()的使用

news2024/11/14 18:43:19
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

在二值图像中查找轮廓。

该函数使用算法 253从二值图像中检索轮廓。轮廓是有用的工具,可用于形状分析和对象检测与识别。参见 OpenCV 示例目录中的 squares.cpp。

findContours 是 OpenCV 库中的一个重要函数,用于从二值图像中检测并提取轮廓。轮廓是指图像中具有连续边界像素的集合,通常用于描述图像中的对象边界。findContours 函数可以从二值图像中找到所有连通的非零像素组成的轮廓,并返回一组轮廓点。

函数原型1


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

参数1

  • 参数image Source, 源图像,一个8位单通道图像。非零像素被视为1。零像素保持为0,因此图像被视为二值图像。你可以使用 compare、inRange、threshold、adaptiveThreshold、Canny 等方法将灰度图像或彩色图像转换为二值图像。如果模式等于 RETR_CCOMP 或 RETR_FLOODFILL,输入也可以是一个32位整数标签图像(CV_32SC1)。

  • 参数contours 检测到的轮廓。每个轮廓存储为一个点的向量(例如 std::vector<std::vectorcv::Point>)。

  • 参数hierarchy 可选的输出向量(例如 std::vectorcv::Vec4i),包含有关图像拓扑结构的信息。它有与轮廓数量相同数量的元素。对于每个第 i 个轮廓 contours[i],元素 hierarchy[i][0]、hierarchy[i][1]、hierarchy[i][2] 和 hierarchy[i][3] 分别设置为在同一层次级别下的下一个轮廓和前一个轮廓在 contours 中的0基础索引,第一个子轮廓和父轮廓。如果对于轮廓 i 没有下一个轮廓、前一个轮廓、父轮廓或嵌套轮廓,hierarchy[i] 的相应元素将是负数。

  • 参数mode 轮廓检索模式,参考RetrievalModes

  • 参数method 轮廓近似方法,参考ContourApproximationModes。

  • 参数offset 可选偏移量,用于移动轮廓上的每一个点。这对于从图像的感兴趣区域(ROI)中提取轮廓并在整个图像上下文中分析这些轮廓时非常有用。

函数原型2

这是一个重载成员函数,为方便提供。它与上述函数的不同之处仅在于它接受的参数


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

代码示例


#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
    // 读取图像
    Mat img = imread( "/media/dingxin/data/study/OpenCV/sources/images/hawk.jpg", IMREAD_GRAYSCALE );
    if ( img.empty() )
    {
        cerr << "Error: Image not found." << endl;
        return -1;
    }

    // 定义一个感兴趣区域
    Rect roi( 260, 450, 250, 250 );
    Mat imgROI = img( roi );

    // 二值化处理
    Mat binImg;
    threshold( imgROI, binImg, 200,255, THRESH_BINARY_INV );

    //imshow( "binary Image", binImg );

    // 找到轮廓
    vector< vector< Point > > contours;
    vector< Vec4i > hierarchy;
    findContours( binImg, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point( roi.x, roi.y ) );  // 应用偏移量

    // 在原图上绘制轮廓
    Mat drawing = Mat::zeros( img.size(), CV_8UC3 );
    for ( size_t i = 0; i < contours.size(); i++ )
    {
        Scalar color = Scalar( 0, 255, 0 );  // 绿色
        drawContours( drawing, contours, i, color, 2, LINE_8, hierarchy, 0, Point() );
    }

    // 显示结果
    imshow( "Original Image", img );
    imshow( "Contours with Offset", drawing );
    waitKey( 0 );

    return 0;
}

运行结果

在这里插入图片描述

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

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

相关文章

SDN架构详解

目录 1&#xff09;经典的IP网络-分布式网络 2&#xff09;经典网络面临的问题 3&#xff09;SDN起源 4&#xff09;OpenFlow基本概念 5&#xff09;Flow Table简介 6&#xff09;SDN的网络架构 7&#xff09;华为SDN网络架构 8&#xff09;传统网络 vs SDN 9&#xf…

网络安全与恶意攻击:如何应对?

引言 随着技术的发展&#xff0c;我们的生活越来越依赖于网络。但是&#xff0c;这也暴露了我们的系统对各种网络威胁的脆弱性。无论是个人还是企业&#xff0c;网络安全都成为了我们不能忽视的话题。 网络威胁的类型 网络威胁主要有以下几种&#xff1a; 网络钓鱼攻击&#…

linux学习--第四天

--linux文件操作 文件IO操作包括&#xff1a; &#xff08;注&#xff1a;I&#xff1a;input&#xff08;输入&#xff09;O&#xff1a;output&#xff08;输出&#xff09;&#xff09; open&#xff1a;打开 close&#xff1a;关闭 read&#xff1a;读取 write&#xff1a;…

c++一个数因子和(快速求解)

void 一个数因子和(int 整数) {//缘由https://ask.csdn.net/questions/1054457#answer_1251715int he 0, j 0; string a "";while (j < 整数)if (!(整数%j))he j, a to_string(j) "";cout << a << "的因子和&#xff1a;" …

如何在 Java 应用程序中定位高 CPU 使用率问题

文章目录 ♨ 前言♨ 提前准备♨ 线上定位♨ 结语 ♨ 前言 在运行 Java 应用程序的服务器上&#xff0c;高 CPU 使用率可能会影响应用程序的性能和稳定性。本文将介绍如何通过一系列步骤和工具来准确诊断和解决高 CPU 使用率问题&#xff0c;特别是针对 Java 环境下的应用程序。…

OpenCV影像数据处理入门-学习篇

目录 简介如何安装图像数据处理简单操作视频数据处理简单操作 一、简介 在计算机视觉项目的开发中&#xff0c;OpenCV作为最大众的开源库&#xff0c;拥有了丰富的常用图像处理函数库&#xff0c;可用于开发实时的图像处理、计算机视觉以及模式识别程序。采用C/C语言编写&am…

用于辅助视障人士检测人行道障碍物的 TinyML 模型

这篇论文的标题为《A TinyML model for sidewalk obstacle detection: aiding the blind and visually impaired people》&#xff0c;发表在《Multimedia Tools and Applications》上。以下是论文的主要内容概述&#xff1a; 摘要&#xff1a; 论文介绍了在资源受限的物联网…

C语言程序设计 笔记代码梳理 重制版

前言 第1章 C语言的流程 1.C程序经历的六个阶段 编辑(Edit)预处理(Preprocess)编译(Compile)汇编(Assemble)链接(Link)执行(Execute) 2.C语言编写代码到运行 都是先编译&#xff0c;后链接&#xff0c;最后运行。&#xff08;.c ---> .obj --->.exe&#xff09;这个过…

热老化的行业应用

热老化应用行业&#xff1a;深度解析与图像呈现 热老化&#xff0c;作为一种重要的材料测试方法&#xff0c;在众多行业中扮演着关键角色。它通过模拟产品在高温环境下的长期使用&#xff0c;提前发现潜在的材料缺陷、性能衰退等问题&#xff0c;从而提高产品的可靠性&#xf…

打造个性化时装购物平台:Spring Boot框架的实践

第1章 绪论 1.1背景及意义 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。人们生活水平的不断提高&#xff0c;日常生活中人们对时装购物系统方面的要求也在不断提高&#xff0c;喜欢购物的人数更是不断增加&#xff0c;使得时装购物系统的开发成为必需而且紧迫的…

顶刊精析|METI:整合细胞形态与空间转录组学的肿瘤微环境分析框架·24-09-06

小罗碎碎念 本期精读文献&#xff1a;《METI: Deep profiling of tumor ecosystems by integrating cell morphology and spatial transcriptomics》 今天分享的这篇文献于2023年8月25日发表在Nat Commun&#xff0c;目前IF14.7。 作者类型作者姓名单位名称&#xff08;中文&am…

【免费分享】25秋招提前批25秋招信息表

秋招&#xff0c;即秋季校园招聘&#xff0c;通常是指每年秋季&#xff08;大约从9月到11月&#xff09;企业在各大高校举办的招聘活动。这是许多公司为了吸引优秀应届毕业生而进行的招聘活动&#xff0c;也是许多学生毕业后进入职场的重要途径。以下是秋招的一些关键点&#x…

手机TF卡格式化后数据恢复:方法、挑战与预防措施

在现代生活中&#xff0c;‌手机已经成为我们不可或缺的一部分&#xff0c;‌而TF卡&#xff08;‌即MicroSD卡&#xff09;‌作为手机存储的扩展&#xff0c;‌更是承载了我们大量的重要数据。‌然而&#xff0c;‌不慎的格式化操作往往导致数据丢失&#xff0c;‌给用户带来不…

集成电路学习:什么是RAM随机存取存储器

RAM&#xff1a;随机存取存储器 RAM&#xff08;Random Access Memory&#xff0c;随机存取存储器&#xff09;是计算机中用于临时存储数据和程序指令的重要存储设备。以下是关于RAM的详细解析&#xff1a; 一、RAM的定义与功能 RAM是一种内部存储器&#xff0c;与CPU直接交换…

(pycharm)安装python库函数Matplotlib步骤

1.在pycharm下面找到terminal&#xff0c;双击输入pip install Matplotlib&#xff0c;进行Matplotlib库函数的安装。 现在&#xff0c;当你运行pip --version或python.exe -m pip --version时&#xff0c;你应该会看到pip的版本已经更新为24.2。

mhtml图片提取 百度图片下载

如果你需要找一些图片&#xff0c;可以先去百度一下&#xff0c;待相关网页加载完成后&#xff0c;点击保存&#xff0c;即可得到一个mhtml文件。这个文件里的图片会用base64进行存储&#xff0c;只需要找到他们并转化就可以。目前在美篇之类的网站上效果还一般&#xff0c;需要…

如何确定 npm 依赖需要的 Node.js 版本?

目录 1&#xff0c;前言2&#xff0c;问题3&#xff0c;解决4&#xff0c;其他 1&#xff0c;前言 有的 npm 依赖会对 Node.js 的版本有要求&#xff0c;主要的原因有几点&#xff1a; 使用了新特性&#xff0c;npm 包使用了新版 Node.js 引入的新 API 或 JavaScript 的新语法…

etcdctl defrag 剔除、添加etcd节点

零、准备工作 find / -name etcdctl cp /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/12/fs/usr/local/bin/etcdctl /usr/local/bin/etcdctlalias ec"etcdctl --endpointshttps://127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --…

常用网络协议理解

1、概念 OSI网络模型由七层组成&#xff0c;从上到下分别是 其中需要用到的且理解的只有应用层、网络层、传输层 2、常见网络协议 协议的作用&#xff0c;就是用于双方规范数据格式&#xff0c;以及规定数据如何在网络中传输 ①应用层协议&#xff1a; HTTP协议&#xff1…

【苍穹外卖】Day 7 地址簿、下单、定时处理

1 地址簿模块 地址簿实体对象&#xff1a; package com.sky.entity;import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor;import java.io.Serializable;/*** 地址簿*/ Data Builder NoArgsConstructor AllArgsCon…