原文链接:https://blog.csdn.net/guduruyu/article/details/69220296

可以通过查找轮廓,找出图像中的对象。这轮廓是由一系列点组成的,根据查找轮廓时的不同方式,得到的轮廓点的数量也会有所不同。

1.cv::findContours解析:

函数cv::findContour是从二值图像中来计算轮廓的,它可以使用cv::Canny()函数处理后的图像,因为这样的图像含有边缘像素;也可以使用cv::threshold()或者cv::adaptiveThreshold()处理后的图像,其边缘隐含在正负区域的交界处。

void cv::findContours(cv::InputOutputArray image, // 输入的8位单通道“二值”图像cv::OutputArrayOfArrays contours, // 包含points的vectors的vectorcv::OutputArray hierarchy, // (可选) 拓扑信息int mode, // 轮廓检索模式int method, // 近似方法cv::Point offset = cv::Point() // (可选) 所有点的偏移);

其中,第一个参数image是输入图像,图像的格式是8位单通道的图像,并且被解析为二值图像(即图中的所有非零像素之间都是相等的)。

第二个参数contours是一个数组的数组,在多数实际的操作中即是STL vectorsSTL vector,这里将使用找到的轮廓的列表进行填充(即,这将是一个contoursvector,其中contours[i]表示一个特定的轮廓,这样,contours[i][j]将表示contour[i]的一个特定的端点)。

第三个参数hierarchy,这个参数可以指定,也可以不提指定。如果指定的话,输出hierarchy,将会描述输出轮廓树的结构信息。其中包含的具体信息前面已经说明(四个条目)。

下一个参数mode,轮廓的模式,将会告诉OpenCV你想用何种方式来对轮廓进行提取,有四个可选的值,具体如下:

cv::RETR_EXTERNAL:表示只提取最外面的轮廓;会有多个外轮廓,不是只有一个外轮廓。cv::RETR_LIST:表示提取所有轮廓并将其放入列表;cv::RETR_CCOMP:表示提取所有轮廓并将组织成一个两层结构,其中顶层轮廓是外部轮廓,第二层轮廓是“洞”的轮廓;cv::RETR_TREE:表示提取所有轮廓并组织成轮廓嵌套的完整层级结构。

下一个参数method是近似方法,即轮廓如何呈现的方法,有三种可选的方法:

cv::CHAIN_APPROX_NONE:将轮廓中的所有点的编码转换成点;cv::CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角直线段,仅保留它们的端点;cv::CHAIN_APPROX_TC89_L1 or cv::CHAIN_APPROX_TC89_KCOS:应用Teh-Chin链近似算法中的一种风格

最后一个参数offset是偏移,可选,如果指定,那么返回的轮廓中的所有点均作指定量的偏移。


2.cv::drawContours解析:

cv::drawContours()用于绘制cv::findContours()找到的轮廓。使用方法其实和OpenCV3中常用的绘图函数类似。具体调用方法如下:

 void cv::drawContours(cv::InputOutputArray image, // 用于绘制的输入图像cv::InputArrayOfArrays contours, // 点的vectors的vectorint contourIdx, // 需要绘制的轮廓的指数 (-1 表示 "all")const cv::Scalar& color, // 轮廓的颜色int thickness = 1, // 轮廓线的宽度int lineType = 8, //  轮廓线的邻域模式('4'邻域 或 '8'邻域)cv::InputArray hierarchy = noArray(), // 可选 (从 findContours得到)int maxLevel = INT_MAX, // 轮廓中的最大下降cv::Point offset = cv::Point() // (可选) 所有点的偏移)

下面是这两个函数的实际使用示例:

cv::Mat image_gray = cv::imread("lena.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat image_binary;cv::threshold(image_gray, image_binary, 100, 255, cv::THRESH_BINARY);
std::vector< std::vector< cv::Point> > contours;
cv::findContours(image_binary,contours,cv::noArray(),cv::RETR_LIST,cv::CHAIN_APPROX_SIMPLE);
image_binary = cv::Scalar::all(0);
cv::drawContours(image_binary, contours, -1, cv::Scalar::all(255));cv::imshow("gray image", image_gray);
cv::imshow("Contours", image_binary);cv::waitKey(0);
return;

【opencv】5.cv::findContours和cv::drawContours()相关推荐

  1. opencv cv.findContours 函数详解

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

  2. OpenCV计算机图像处理 —— 凸性缺陷 + 点多边形测试 + 形状匹配 + 轮廓分层与cv.findContours()

    OpenCV计算机图像处理 -- 凸性缺陷 + 点多边形测试 + 形状匹配 + 轮廓分层与cv.findContours() 目录 OpenCV计算机图像处理 -- 凸性缺陷 + 点多边形测试 + 形 ...

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

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

  4. OpenCV序列中创建矩阵cv :: Mat的实例(附完整代码)

    OpenCV序列中创建矩阵cv :: Mat的实例 OpenCV序列中创建矩阵cv :: Mat的实例 OpenCV序列中创建矩阵cv :: Mat的实例 #include "opencv2 ...

  5. OpenCV中的「透视变换 / 投影变换 / 单应性」—cv.warpPerspective、cv.findHomography

    文章目录 引言 透视变换(projective transform) 单应性(Homography) opencv代码 仿射变换相关函数 投影变换相关的函数 鸟瞰图代码示例 小结 引言 图像的几何变换 ...

  6. OpenCV颜色空间转换函数:cv::cvtColor介绍

    OpenCV颜色空间转换函数:cv::cvtColor介绍 Color Conversion Code(颜色转换代码) Enumerator COLOR_BGR2BGRA add alpha chan ...

  7. OpenCV-Python学习(19)—— OpenCV 图像几何变换之图像缩放(cv.warpAffine、cv.resize)

    1. 学习目标 学习图像的缩放矩阵: 学习 OpenCV 图像缩放函数 cv.resize 和 cv.warpAffine. 2. 图像的缩放矩阵 缩放是物体在 x 轴和 y 轴的缩放比例. fx 是 ...

  8. Opencv(C++)笔记--模板匹配cv::matchTemplate()和最值计算cv::minMaxLoc()

    目录 1--模板匹配 1-1--OpenCV API 1-2--六种匹配方法 1-3--代码实例 2--最值计算 2-1--OpenCV API 1--模板匹配 使用模板图像与原图像进行匹配,Open ...

  9. OpenCV-Python学习(9)—— OpenCV 通道的分离与合并(cv.split、cv.merge、cv.mixChannels、cv.inRange)

    1. 知识点 BGR/HSV 彩色通道分离为单独通道: 针对不同通道使用不同阀值提取mask: 学会使用[通道分离]函数 cv.split: 学会使用[通道合并]函数 cv.merge: 学会使用[把 ...

最新文章

  1. Oracle ORA-600 [2662] 错误
  2. python批量ping50台服务器_Python小技巧—批量ping的方法
  3. oracle分组汇总人数,Oracle实现分组统计记录
  4. matlab6.0序列号,MFC软件获取USB设备的制造商、产品、序列号
  5. 【Word】一些实用的小技巧
  6. My blog in AI ---神经网络,神经元(neural network,nervecell)
  7. linux下环境变量设置的问题
  8. 什么是软件测试,测试基础有哪些?
  9. 管理win7开机启动项
  10. Java——时间日期格式化
  11. NOIP2016普及组T4(魔法阵)题解
  12. 高通mdm9607 分区表修改
  13. Arduino /*传感器使用指南
  14. postgresql 解锁表
  15. 在可见光波长下用银树突超表面进行微分运算
  16. window脚本介绍
  17. window.print()打印网页局部内容
  18. 洛谷P1035题解 [NOIP2002 普及组] 级数求和
  19. input 禁止手机唤起软键盘,并且光标存在
  20. 直线特征提取算法:IEPF(iterative end point fit)

热门文章

  1. 【android-tips】SurfaceView的制作android游戏框架介绍
  2. 字符编码的前世今生--转
  3. Guide: Solr performance tuning--转载
  4. 数学建模学习笔记——微分方程建模
  5. 【Python】xlwt基础:excel存取读写
  6. 元宇宙iwemeta: 元宇宙与数字经济
  7. 聚焦数字货币的发展与监管
  8. 根据 *_train_test.prototxt文件生成 *_deploy.prototxt文件
  9. 容器删除元素后迭代器失效_STL 4: STL之容器:选择时机,删除元素,迭代器失效...
  10. SpringBoot - 探究Spring Boot应用是如何通过java -jar 启动的