http://blog.csdn.net/lu597203933/article/details/17362457

连通区域指的是二值图像中相连像素组成的形状。而内、外轮廓的概念及opencv1中如何提取二值图像的轮廓见我的这篇博客:http://blog.csdn.net/lu597203933/article/details/14489225

轮廓的简单提取算法如下:

系统性地扫描图像直到遇到连通区域的一个点,以它为起始点,跟踪它的轮廓,标记边界上的像素。当轮廓完整闭合,扫描回到上一个位置,直到再次发现新的成分。

代码:

  1. #include <iostream>
  2. #include <opencv2\core\core.hpp>
  3. #include <opencv2\highgui\highgui.hpp>
  4. #include <opencv2\imgproc\imgproc.hpp>
  5. using namespace std;
  6. using namespace cv;
  7. // 移除过小或过大的轮廓
  8. void getSizeContours(vector<vector<Point>> &contours)
  9. {
  10. int cmin = 100;   // 最小轮廓长度
  11. int cmax = 1000;   // 最大轮廓长度
  12. vector<vector<Point>>::const_iterator itc = contours.begin();
  13. while(itc != contours.end())
  14. {
  15. if((itc->size()) < cmin || (itc->size()) > cmax)
  16. {
  17. itc = contours.erase(itc);
  18. }
  19. else ++ itc;
  20. }
  21. }
  22. // 计算连通区域的轮廓,即二值图像中相连像素的形状
  23. int main()
  24. {
  25. Mat image = imread("E:\\opencv2cv\\lesson7\\Debug\\55.png",0);
  26. if(!image.data)
  27. {
  28. cout << "Fail to load image" << endl;
  29. return 0;
  30. }
  31. Mat imageShold;
  32. threshold(image, imageShold, 100, 255, THRESH_BINARY);   // 必须进行二值化
  33. vector<vector<Point>> contours;
  34. //CV_CHAIN_APPROX_NONE  获取每个轮廓每个像素点
  35. findContours(imageShold, contours, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE, cvPoint(0,0));
  36. getSizeContours(contours);
  37. cout << contours.size() << endl;
  38. Mat result(image.size(), CV_8U, Scalar(255));
  39. drawContours(result, contours, -1, Scalar(0), 2);   // -1 表示所有轮廓
  40. namedWindow("result");
  41. imshow("result", result);
  42. namedWindow("image");
  43. imshow("image", image);
  44. waitKey(0);
  45. return 0;
  46. }

结果:

未移除过大多小的轮廓前:

移除后:

Opencv2系列学习笔记10(提取连通区域轮廓) 另一个的更多相关文章

  1. Opencv2系列学习笔记10(提取连通区域轮廓)

    连通区域指的是二值图像中相连像素组成的形状.而内.外轮廓的概念及opencv1中如何提取二值图像的轮廓见我的这篇博客:http://blog.csdn.net/lu597203933/article/ ...

  2. Opencv2系列学习笔记2(图像的其它操作)

    本节主要涉及到图像的领域.算术操作以及如何操作图像感兴趣的区域. 一:邻域操作 以下例子主要对图像进行锐化.基于拉普拉斯算子<后面讨论>.这幅图像的边缘部分将得到放大,细节部分将更加的锐利 ...

  3. Opencv2系列学习笔记8(图像滤波)

    一:概念: 滤波是信号处理机图像处理中的一个基本操作.滤波去除图像中的噪声,提取感兴趣的特征,允许图像重采样. 图像中的频域和空域:空间域指用图像的灰度值来描述一幅图像:而频域指用图像灰度值的变化来描 ...

  4. opencv学习笔记(二)寻找轮廓

    opencv学习笔记(二)寻找轮廓 opencv中使用findContours函数来查找轮廓,这个函数的原型为: void findContours(InputOutputArray image, O ...

  5. OpenCV2学习笔记(十四):基于OpenCV卡通图片处理

    得知OpenCV有一段时间.除了研究的各种算法的内容.除了从备用,据导游书籍和资料,尝试结合链接的图像处理算法和日常生活,第一桌面上(随着摄像头)完成了一系列的视频流处理功能.开发平台Qt5.3.2+ ...

  6. OpenCV:二值图像连通区域分析与标记算法实现

    http://blog.csdn.net/cooelf/article/details/26581539?utm_source=tuicool&utm_medium=referral Open ...

  7. Java系列笔记(3) - Java 内存区域和GC机制

    目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...

  8. MVA Universal Windows Apps系列学习笔记1

    昨天晚上看了微软的Build 2015大会第一天第一场演讲,时间还挺长,足足3个小时,不过也挺震撼的.里面提到了windows 10.Microsoft edge浏览器.Azure云平台.Office ...

  9. 使用OpenCV查找二值图中最大连通区域

    http://blog.csdn.net/shaoxiaohu1/article/details/40272875 使用OpenCV查找二值图中最大连通区域 标签: OpenCVfindCoutour ...

随机推荐

  1. C#多线程:深入了解线程同步lock,Monitor,Mutex,同步事件和等待句柄(中)

    本篇继续介绍WaitHandler类及其子类 Mutex,ManualResetEvent,AutoResetEvent的用法..NET中线程同步的方式多的让人看了眼花缭乱,究竟该怎么去理解呢?其实, ...

  2. Mysql索引基础

    Mysql索引基础 基本概念: 索引是一种特殊的数据库结构,可以用来快速查询数据库表中的特定记录.索引是提高数据库性能的重要方式.索引创建在表上,是对数据库表中一列或多列的值进行排序的一种结构.可以提 ...

  3. python生产者消费者模型

    业界用的比较广泛,多线程之间进行同步数据的方法,解决线程之间堵塞,互相不影响. server --> 生产者 client --> 消费者 在一个程序中实现又有生产者又有消费者 ,生产者不 ...

  4. KVM guest caching modes

    kvm中host和guest各自维护自己的page caches,使得内存中有两份缓存数据.host的缓存为page cache可以理解为读缓存,guest的缓存为disk write cache,可 ...

  5. jqGrid使用整理

    jqGrid使用整理 jqGrid是一款处理表格展现的jQuery插件,支持分页.滚动加载.搜索.锁定.拖动等一系列对表格的常规操作.以下是最近项目中实践jqGrid的整理 1.引入到项目中来 jqG ...

  6. [!] Error installing AFNetworking

    cocoaPods 报错!!! [!] Error installing AFNetworking[!] /usr/local/bin/git clone https://github.com/AFN ...

  7. CocoaPods 报错 [!] Error installing JSONModel

    pod install p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #34bd26 } span.s1 { } ...

  8. 打开新世界的第一步:学习servlet

    什么是servlet? 是用Java编写的服务器端程序.其主要功能在于交互式地浏览和修改数据,生成动态Web内容. 创建servlet 一.创建一个web project 1)流程:eclipse-F ...

  9. react视频入门

    http://pan.baidu.com/s/1i46by8t     密码:48tt

  10. activity 嵌套一级fragment,一级fragment嵌套二级fragment,在一级fragment中刷新二级fragment中的UI

    今天遇到挺纠结的问题,由于产品设计的问题,技术上涉及到activity 嵌套一级fragment,一级fragment嵌套二级fragment,在一级fragment中刷新二级fragment中的UI ...