OpenCV findContours详解及范例

这篇具有很好参考价值的文章主要介绍了OpenCV findContours详解及范例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、函数原型及参数:

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

 其中重要的参数为:

1.hierarchy:

官方文档原文:

OpenCV findContours详解及范例

是一个类型为:vector<Vec4i>的变量。Vec4i是Vec<int,4>的别名,定义了一个“向量内每一个元素包含了4个int型变量”的向量。向量内每个元素保存了一个包含4个int整型的数组。向量hiararchy内的元素和轮廓向量contours内的元素是一一对应的,向量的容量相同。hierarchy向量内每一个元素的4个int型变量——hierarchy[i][0] ~hierarchy[i][3],分别表示第 i个轮廓的后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。如果当前轮廓没有对应的后一个 轮廓、前一个轮廓、父轮廓或内嵌轮廓的话,则hierarchy[i][0] ~hierarchy[i][3]的相应位被设置为默认值-1。

2.mod:

在枚举参数中选择:

OpenCV findContours详解及范例

CV_RETR_EXTERNAL:只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略

CV_RETR_LIST:   检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立,没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓,hierarchy向量内所有元素的第3、第4个分量都会被置为-1

CV_RETR_CCOMP:  检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层

CV_RETR_TREE: 检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。

3.method:

在枚举参数中取值:

OpenCV findContours详解及范例

CV_CHAIN_APPROX_NONE 保存物体边界上所有连续的轮廓点到contours向量内

CV_CHAIN_APPROX_SIMPLE 仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours向量内,拐点与拐点之间直线段上的信息点不予保留

 CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

二、参考范例:

-----------------------------------------------------------

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int testContours(Mat thres_gray)
{
	//调用findCounter函数
	vector<vector<Point> > contours;
	vector<Vec4i> hierarchy;
	findContours(thres_gray, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);

	//绘制轮廓
	Mat drawing = Mat::zeros(canny_output.size(), CV_8UC3);
	int count1 = 0;
	int count2 = 0;

	把所有轮廓都画出来
	//-------------------------------------------------------------------------------
	for (size_t i = 0; i < contours.size(); i++)
	{
		count1 += 1;
		Scalar color = Scalar(0, 0, 255);
		drawContours(drawing, contours, (int)i, color, 1, LINE_AA, hierarchy, 0);
	}
	cout << "count1 is : \n" << count1 << endl;
	//------------------------------------------------------------------------

	只画顶层轮廓
	-------------------------------------------------------------------------------
	//for (int index = 0; index >= 0; index = hierarchy[index][0]) {
	//	count2 += 1;
	//	Scalar color = Scalar(255, 0, 0);
	//	drawContours(drawing, contours, (int)index, color, 1, LINE_AA, hierarchy, 0);
	//}

	//cout << "count2 is : \n" << count2 << endl;
	-----------------------------------------------------------------------------------

	imshow("Contours", drawing);

	waitKey();
	return 0;

}

参考:

1.Opencv Docs

2.Opencv轮廓检测findContours分析(层次结构) - 简书 (jianshu.com)

3. findContours函数参数详解_-牧野-的博客-CSDN博客_findcontours函数解析

4. OpenCV学习笔记十一-findcounters函数_安东time的博客-CSDN博客_findcounters函数 文章来源地址https://www.toymoban.com/news/detail-441139.html

到了这里,关于OpenCV findContours详解及范例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv 轮廓检测 findContours drawContours

    2024年02月16日
    浏览(47)
  • findContours函数详细解析

    cnts解析: cnts代表的是找到的轮廓的点集的集合,它是一个numpy中的列表结构。你也可以把它理解为一个存储着图像中每个轮廓的数组,就像这样: 只不过这个数组的每个位置存储的是图片中的一小部分图像(因为画一个轮廓只是画了整个图片的一部分,上文提到,画轮廓是

    2024年02月05日
    浏览(31)
  • OpenCV查找和绘制轮廓:findContours和drawContours

    1  任务描述: 绘制图中粗线矩形的2个边界,并找到其边界的中心线 图1 原始图像  2.函数原型 findContours( InputOutputArray image, OutputArrayOfArrays contours,                               OutputArray hierarchy, int mode,                               int method, Point offset=Point()); image:图

    2024年02月07日
    浏览(43)
  • opencv-python3 | cv2.findContours()检测图像中物体轮廓

    轮廓可以简单地理解为连接所有连续点(沿物体边界)的曲线,这些点通常具有相同的颜色或强度。 轮廓在图像分析中具有重要意义,是物体形状分析和对象检测和识别的有用工具,是理解图像语义信息的重要依据。 通常,为了提高物体轮廓检测的准确率,首先要将彩色图

    2024年02月05日
    浏览(47)
  • 数字图像处理【11】OpenCV-Canny边缘提取到FindContours轮廓发现

    本章主要介绍图像处理中一个比较基础的操作:Canny边缘发现、轮廓发现 和 绘制轮廓。概念不难,主要是结合OpenCV 4.5+的API相关操作,为往下 \\\"基于距离变换的分水岭图像分割\\\" 做知识储备。 在讲述轮廓之前,要花点时间学学边缘检测提取的一个著名算法——Canny边缘提取算法

    2024年02月16日
    浏览(38)
  • 【C++】STL 算法 - for_each 遍历算法 ( for_each 函数原型 | for_each 函数源码分析 | for_each 函数 _Fn _Func 参数 值传递说明 )

    在 C++ 语言 的 标准模板库 ( STL , Standard Template Library ) 中 , 提供了 for_each 算法 用于 对一个 STL 容器中的每个元素执行某个指定的 \\\" 操作 \\\" ; for_each 算法 中 执行的 \\\" 操作 \\\" 可以是一个 函数 / 函数对象 / Lambda 表达式 ; 在 for_each 函数 中 可以修改 被遍历的元素 , 也可以 不修改

    2024年01月17日
    浏览(40)
  • 【Python】【OpenCV】关于cv2.findContours()轮廓索引(编号)解析(RETR_TREE)

    在打算自己实现二维码的定位的时候,看到了相关博文的关于cv2.findContours返回的层级信息来定位三个“回”字从而达到定位二维码的目的,但是返回的hierarchy中的层级信息分别对应的是哪个轮廓却困扰了许久,查阅了很多资料最后还是自己手动找出了清晰的规律。 关于hier

    2024年02月04日
    浏览(34)
  • elasticsearch 其他字段类型详解和范例

    elasticsearch 中 别名字段 的详解和范例 elasticsearch 中 二进制类型 的详解和范例 elasticsearch 中的 嵌套类型 的详解和范例 elasticsearch 中的 范围类型 的详解和范例 elasticsearch 中的 排名类型 的详解和范例 elasticsearch 中的 ip类型 的详解和范例 elasticsearch 中的 search-as-you-type 类型 的详

    2024年02月02日
    浏览(39)
  • elasticsearch 常用数据类型详解和范例

    elasticsearch 中的字符串(keyword)类型 的详解和范例 elasticsearch 中的字符串/文本(text)类型 的详解和范例 elasticsearch 中的数字(数值)类型 的详解和范例 elasticsearch 中的布尔(boolean)类型 的详解和范例 elasticsearch 中的日期(date)类型 的详解和范例 elasticsearch 中的地理(

    2024年02月09日
    浏览(35)
  • 我在Vscode学OpenCV 图像处理四(轮廓查找 cv2.findContours() cv2.drawContours())-- 待补充

    在OpenCV中,边缘检测和轮廓查找是两个不同的图像处理任务,它们有不同的目标和应用。 1.1.1 边缘检测: 定义: 边缘检测是指寻找图像中灰度级别变化明显的地方,即图像中物体之间的界限。这些变化通常表示图像中的边缘或轮廓。 方法: 常用的边缘检测算法包括Sobel、

    2024年02月03日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包