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

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

  • 操作系统: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;
}

运行结果

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 威胁建模中的评估问题列表
  • 鸿蒙轻内核A核源码分析系列七 进程管理 (1)
  • nacos 高级 配置管理 动态路由
  • HCIA--实验十三:VLAN间通信子接口实验/双单臂路由实验
  • 学会这2项技能,普通人每年多赚10万+,互联网创业者必备!
  • 华为 HCIP-Datacom H12-821 题库 (15)
  • 通讯录(静态版)
  • GitLab CI Runner安装
  • 活动系统开发之采用设计模式与非设计模式的区别-非设计模式
  • [mysql]SQL语言的规则和规范
  • 黑链、黑帽、明链分别是什么意思
  • 通话记录被删除,如果快速恢复iPhone手机通话记录
  • 网络药理学:分子动力学模拟入门、gromacs能量最小化
  • 【原理图PCB专题】案例:Cadence能设计一个没有管脚的器件吗?
  • 云曦2024秋季开学考
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Android系统模拟器绘制实现概述
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Leetcode 27 Remove Element
  • Mithril.js 入门介绍
  • Mysql5.6主从复制
  • Python 反序列化安全问题(二)
  • vue.js框架原理浅析
  • windows-nginx-https-本地配置
  • 通过npm或yarn自动生成vue组件
  • 想使用 MongoDB ,你应该了解这8个方面!
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​Redis 实现计数器和限速器的
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • # Java NIO(一)FileChannel
  • #if等命令的学习
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .gitignore文件---让git自动忽略指定文件
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .Net 代码性能 - (1)
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @requestBody写与不写的情况
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [Cloud Networking] Layer Protocol (continue)
  • [codeforces]Checkpoints
  • [C语言]-基础知识点梳理-编译、链接、预处理
  • [FFmpeg学习]从视频中获取图片
  • [HNOI2006]鬼谷子的钱袋
  • [HNOI2008]Cards
  • [kylin M900]麒麟操作系统固件修改与合成
  • [LeetCode]-225. 用队列实现栈-232. 用栈实现队列