前言

这样一张图片,如何在图像中找到圆环并标出呢?

一、利用findContours函数

函数中的第三个参数,hierarchy,定义为“vector< Vec4i > hierarchy”,是一个能表示层级关系的附加参数,定义为:hierarchy[i][0]表示同级的下一个轮廓的索引号,hierarchy[i][1]表示同级的上一个轮廓的索引号,hierarchy[i][2]表示第一个内部轮廓的索引号,hierarchy[i][3]表示外部轮廓的索引号。因此,通过这些轮廓关系可以找到图片中的最里面的圆,然后再找外圈圆,代码如下:

二、实现代码

vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(src, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());
Mat imageContours = Mat::zeros(src.size(), CV_8UC1);
Mat imageContours1 = Mat::zeros(src.size(), CV_8UC1);for (int i = 0; i < contours.size(); i++) {//找到最里圆的内轮廓if (hierarchy[i][2] == -1) {   innerIndexs.push_back(i);int fIndex = hierarchy[i][3];    //这层是最里圆的外轮廓secondIndexs.push_back(hierarchy[fIndex][3]);  //这层是外圆的内轮廓}
}//画出里圆
for (auto & i : innerIndexs) {drawContours(imageContours, contours, i, Scalar(255), FILLED);
}//画出外圆
for (auto & i : secondIndexs) {drawContours(imageContours1, contours, i, Scalar(255), FILLED);
}//获取圆环
Mat dst;
bitwise_xor(imageContours1, imageContours, dst);

三、结果

其它

有意思的是,同样的代码对于白底黑边的图的结果不一样。
src:

dst:

我大概看了下,这种背景颜色的图返回的层级关系是乱的,所以,我的处理方式是先对原图取反,另外,大家还有没有其它更好的方法,可以分享一下。

bitwise_not(src, src);

Opencv—利用findContours函数找圆环,并标出(简单层级)相关推荐

  1. opencv cv.findContours 函数详解

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

  2. OpenCV中findContours函数的使用

    http://blog.csdn.net/corcplusplusorjava/article/details/20536251 转载于:https://www.cnblogs.com/gaohai/ ...

  3. 【图像处理】——Python+opencv实现二值图像的轮廓边界跟踪以及轮廓面积周长的求解(findcontours函数和contourArea函数)

    目录 一.函数 cv.findContours 二.轮廓层级(返回参数hierarchy) 三.轮廓寻找方式 1. RETR_LIST 2. RETR_TREE 3. RETR_EXTERNAL 4. ...

  4. 查找字符串末尾含关键字_EXCEL函数公式大全之利用FIND函数和RIGHT函数LEN函数取末尾字符...

    EXCEL函数公式大全之利用FIND函数和RIGHT函数LEN函数从字符串末尾取出指定长度的字符,从字符串中取出销售员的姓名.EXCEL函数与公式在工作中使用非常的频繁,会不会使用公式直接决定了我们的 ...

  5. opencv 利用图像轮廓函数填充圆环内部 图像轮廓函数应用小例子

    实验: import cv2 as cv import numpy as np# 1.读入圆环 img = cv.imread('circle_ring.jpg') img_gray = cv.cvt ...

  6. C++opencv找圆心?看着一篇,一定有你要(边缘轮廓检测,拟合,凸包)找出相应的轮廓或者全部轮廓画外界圆轮廓并且标出轮廓中心

    一,利用面积对轮廓进行筛选 注意这种面积筛选有一个弊端就是比如有两个轮廓, A轮廓为500 B轮廓为300 当面积设置为 area<400时就可以筛选出面积小于300的所有轮廓 反之大于300的 ...

  7. opencv 利用轮廓检索函数实现字母匹配(图像匹配)

    在待识别图像上找到模板图像 待识别图像: 模板图像: 识别原理 1. 将待识别图像 -> 灰度图像 -> 二值图像 2. 通过轮廓检索函数 cv.findContours 找到待识别图像所 ...

  8. OpenCV findContours函数参数

    目录 OpenCV findContours函数参数 python检测外轮廓: c++轮廓检测: 一.mode取值"CV_RETR_EXTERNAL",method取值" ...

  9. 利用OpenCV的findContours作轮廓检测

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 问: 边缘检测与轮廓检测有什么区别? 边缘检测是 ...

  10. python-opencv2利用cv2.findContours()函数来查找检测物体的轮廓

    轮廓检测 轮廓检测也是图像处理中经常用到的.OpenCV-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓. 实现 使用方式如下: import cv2   img ...

最新文章

  1. 专业介绍Linux中的进程管理
  2. Qt Creator使用语言服务器
  3. pycharm在401跑程序需要每个py文件加一句
  4. 在oracle下我们如何正确的执行数据库恢复
  5. 常用类一一枚举类一一定义和调用
  6. WPF 实现动态Windows桌面壁纸~
  7. GitHub 2019年度报告,用户超4000万
  8. Apache Camel 2.12 –支持后退,以减少较积极的轮询路线
  9. MapReduce:处理数据密集型文本处理–局部聚合第二部分
  10. mysql的jar包文件在哪找_java连接mysql要导入的jar包在哪。
  11. Android Stadio(3)---使用fbc快捷键快速生成findViewById
  12. 【机器学习】图解最常用的10个机器学习算法!
  13. gvim 常用命令
  14. php之mysql(数据库的连接)出错问题及解决,cmd操作数据库失败
  15. atitit.导出excel的设计----查询结果 导出为excel的实现java .net php 总结
  16. Python进行停用词表去重
  17. 惠普局域网共享打印机设置_打印机usb转网络?打印机共享怎么设置?怎样设置hp打印机共享器操作方法...
  18. ido 0.5 发布
  19. 工作台式计算机配置单,台式电脑配置清单.doc
  20. 【宽创热点】为什么博物馆要展示古代糕点和比基督更古老的牛肉

热门文章

  1. 该市官宣:高校有序解除封闭管理!
  2. 电脑如何开启卓越性能模式
  3. [Ubuntu] 二、安卓模拟器
  4. labelme 语义分割数据集_【综述系列】语义分割研究要用到的数据集介绍(一)...
  5. Latex:目录和标题
  6. java dos攻击_一种高级的DoS攻击-Hash碰撞攻击
  7. 杂文 - 设计MIUI主题 的 MIUI设计师
  8. Centos-Wake On Lan远程唤醒服务器
  9. 备份和恢复是解决勒索病毒的最佳方案
  10. App邀请机制下,策略决定成败