当前位置: 首页 > 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;
}

运行结果

在这里插入图片描述

http://www.lryc.cn/news/431753.html

相关文章:

  • HBase 源码阅读(二)
  • 深度学习每周学习总结N9:transformer复现
  • 数据结构与算法(3)栈和队列
  • 11、Django Admin启用对计算字段的过滤
  • xxl-job升级到springboot3.0 导致页面打不开报错)问题
  • 栈和队列.
  • Parallel.ForEach - 并行处理
  • 【MySQL】初识MySQL—MySQL是啥,以及如何简单操作???
  • LLM应用实战: 产业治理多标签分类
  • 下载Mongodb 4.2.25 版本教程
  • docker拉取redis5.0.5并建立redis集群
  • React16新手教程记录
  • 怎么摆脱非自然链接?
  • 【2024数模国赛赛题思路公开】国赛B题第二套思路丨附可运行代码丨无偿自提
  • P1166 打保龄球
  • [数据集][目标检测]西红柿成熟度检测数据集VOC+YOLO格式3241张5类别
  • 数仓工具—Hive语法之URL 函数
  • c#如何实现触发另外一个文本框的回车事件
  • Vue 中 nextTick 的最主要作用是什么,为什么要有这个 API
  • python科学计算:NumPy 数组的运算
  • SAP B1 基础实操 - 用户定义字段 (UDF)
  • Idea发布springboot项目无法识别到webapp下面的静态资源
  • Redis及其他缓存
  • golang入门
  • Behind the Code:与 Rakic 和 Todorovic 对话 OriginTrail 如何实现 AI 去中心化
  • TS 学习 (持续更新中)
  • el-table使用type=“expand”根据数据条件隐藏展开按钮
  • 9月6日(∠・ω<)⌒☆
  • k8s执行crictl images报错
  • 基于人工智能的音乐情感分类系统