作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

函数原型

void findContours( InputArray image, OutputArrayOfArrays contours,OutputArray hierarchy, int mode,int method, Point offset = Point());void drawContours( InputOutputArray image, InputArrayOfArrays contours,int contourIdx, const Scalar& color,int thickness = 1, int lineType = LINE_8,InputArray hierarchy = noArray(),int maxLevel = INT_MAX, Point offset = Point() );

参数说明

       findContours:

  1. InputArray类型的image,输入图像,需是8位单通道图像。非零像素视为1,0像素为0,二进制表示。
  2. OutputArrayOfArrays类型的contours,检测到的轮廓结果存放在此,每个轮廓存储为一个点向量,用point类型的vetor表示。
  3. OutputArray类型的hierarchy,可选的输出向量,包含图像的拓扑信息。其作为轮廓数量的表示,包括多个元素。每个轮廓contours[i]有4个hierarchy元素——hierarchy[i][0]~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,对应值设为负数。
  4. int类型的mode,轮廓检索模式。RETR_EXTERNAL表示只检测最外围轮廓;RETR_LIST表示提取所有轮廓并放置在list中,无等级关系;RETR_CCOMP表示提取所有轮廓,并将其组织为双层结构;RETR_TREE表示提取所有轮廓,并重新建立网状的轮廓结构。
  5. int类型的method,轮廓近似方法。CHAIN_APPROX_NONE表示获取每个轮廓的每个像素;CHAIN_APPROX_SIMPLE表示压缩水平方向、垂直方向、对角方向的元素,只保留该方向的终点坐标;CHAIN_APPROX_TC89_L1和CHAIN_APPROX_TC89——KCOS表示Teh-Chinl链逼近算法。
  6. Point类型的offset,每个轮廓点的可选偏移量。

       drawContours:

  1. InputArray类型的image,输入图像。
  2. OutputArrayOfArrays类型的contours,检测到的轮廓结果存放在此,每个轮廓存储为一个点向量,用point类型的vetor表示。
  3. int类型的contourIdx,轮廓绘制的指示变量。如果其为负值,则绘制所有轮廓。
  4. const Scalar&类型的color,轮廓的颜色。
  5. int类型的thickness,轮廓线条的粗细度,有默认值1。如果其为负值,则会绘制在轮廓的内部。可选为FILLED。
  6. int类型的lineType,线条的类型,默认值为8。可取8(8连通线型)、4、LINE_AA(抗锯齿线型)。
  7. InputArray类型的hierarchy,可选的层次结构信息。
  8. int类型的maxLevel,表示用于绘制轮廓的最大等级,默认为INT_MAX。
  9. Point类型的offset,可选的轮廓偏移参数。

测试代码

#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<ctime>
using namespace std;
using namespace cv;
int main(void)
{// 输入测试图片Mat in = imread("tangsan.jpg", 0);imshow("original", in);// 初始化结果矩阵Mat out = Mat::zeros(in.size(), in.type());Mat temp= Mat::zeros(in.size(), in.type());// 阈值计算,最大类间方差法threshold(in, temp, 0, 255, cv::THRESH_OTSU);      imshow("thresh", temp);// 寻找轮廓vector<vector<Point>> contour;vector<Vec4i> hierarchy;// RETR_TREE以网状结构提取所有轮廓,CHAIN_APPROX_NONE获取轮廓的每个像素findContours(temp, contour, hierarchy, RETR_TREE, CHAIN_APPROX_NONE);// 随机选择一个颜色,并绘制轮廓Scalar color( rand() % 255, rand() % 255, rand() % 255);drawContours(out, contour, -1,color, FILLED, 8, hierarchy);imshow("result", out);waitKey(0);system("pause");return 0;
}

测试效果

图1 效果图

不难看出,轮廓结果图中间少了些东西,这是因为提取轮廓选用的是最外圈提取法,外圈轮廓的内嵌轮廓都被清除了~

如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

OpenCV-寻找轮廓cv::findContours绘制轮廓cv::drawContours相关推荐

  1. Opencv边缘检测、轮廓发现、绘制轮廓

    Opencv边缘检测.轮廓发现.绘制轮廓 提取图像轮廓的2个步骤 1. findContours函数找轮廓, 2. drawContours函数画轮廓 轮廓的查找--cv::findContours( ...

  2. opencv cv.findContours 函数详解

    函数 cv.findContours contours, hierarchy = cv.findContours( image, mode, method[, contours[, hierarchy ...

  3. OpenCV之findContours获取轮廓(Python版)

    参考:https://blog.csdn.net/loovelj/article/details/78739790 OpenCV自带寻找轮廓的函数,流程是:获取灰度图→图片二值化→寻找轮廓 直接上代码 ...

  4. 【opencv】5.cv::findContours和cv::drawContours()

    原文链接:https://blog.csdn.net/guduruyu/article/details/69220296 可以通过查找轮廓,找出图像中的对象.这轮廓是由一系列点组成的,根据查找轮廓时的 ...

  5. 【OpenCV函数】轮廓提取;轮廓绘制;轮廓面积;外接矩形

    FindContours 在二值图像中寻找轮廓  int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_cont ...

  6. opencv笔记二十九(轮廓发现)findContours(t2, contour, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));

    API: cv::findContours( //发现轮廓 InputOutputArray  binImg, // 输入图像,非0的像素被看成1,0的像素值保持不变,8-bit OutputArra ...

  7. OpenCV图像发现轮廓函数findContours()的使用

    OPenCV版本:4.4 IDE:VS2017 功能描述 简述:在一个二进制图像里发现轮廓. 函数在二进制图像中使用Suzuki85算法获取轮廓.轮廓对形状分析和目标检测与识别是一个有用的工具,用法见 ...

  8. 【OpenCV-Python】——边缘和轮廓Laplacian/Sobel/Canny边缘检测查找/绘制轮廓及轮廓特征霍夫直线/圆变换

    目录 前言: 1.边缘检测 1.1 Laplacian边缘检测 1.2 Sobel边缘检测 1.3 Canny边缘检测 2.图像轮廓 2.1 查找轮廓 2.2 绘制轮廓 2.3 轮廓特征 3.霍夫变换 ...

  9. 【youcans 的 OpenCV 例程200篇】194.寻找图像轮廓(cv.findContours)

    OpenCV 例程200篇 总目录-202205更新 [youcans 的 OpenCV 例程200篇]194.寻找图像轮廓(cv.findContours) 1. 轮廓 轮廓是一系列相连的像素点组成 ...

最新文章

  1. tcp/ip 协议栈Linux源码分析一 IPv4分片报文重组分析一
  2. H3C FTP配置示例
  3. Linux umask限制导致php的mkdir 0777无效
  4. 索引扫描时,对同一个叶子块访问多次的原因初探
  5. 双向板受力特点_弹性减震球形钢支座/双向弹簧铰支座特性
  6. 思科模拟器 静,动态路由配置
  7. 【HDU1255】【扫描线 —— 矩形面积交】覆盖的面积
  8. 测试开发面试-技术题持续累积
  9. linux calloc
  10. 从新手到Flutter架构师,一篇就够!这原因我服了
  11. 导出的 EXCEL 用 office2016 打不开
  12. 临时邮箱怎么用?邮箱客户端设置
  13. git中无法拉取remote仓库中的更新(Untracked Files Prevent Merge)
  14. 网易视频云:HBase优化实战
  15. n元(维)正态分布(The multivariate normal distribution)
  16. Linux /etc/fstab文件详解
  17. 后李健熙时代的三星,将迎来怎样变局?
  18. 【题解】【AcWing】1615. 哈密顿回路
  19. 智慧旅游建设的目的和特点是什么?
  20. 怎么保证测试用例的覆盖率

热门文章

  1. swift中的只读属性实现,很简单
  2. 【更新汇总】FastReport系列更新|附下载
  3. maven笔记(2)-- 构建Java Project 及 Maven命令使用
  4. 学习日记之工厂方法模式和Effective C++
  5. 在别人客户端上修改,来匹配测试自己的服务端
  6. 浅谈第三方电子支付平台测试方法的研究
  7. 第四篇: UpdatePanel 控件--触发机制Triggers
  8. codova添加android慢_从 0 开始学 Linux 内核之 android 内核栈溢出 ROP 利用
  9. getprivateprofilestring读不到数据_SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾
  10. 辣条社区:问题解答、面试系列、求职助力、学习资源,你需要的都在这里