博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opencv学习笔记(二)寻找轮廓
阅读量:6642 次
发布时间:2019-06-25

本文共 3975 字,大约阅读时间需要 13 分钟。

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

  opencv中使用findContours函数来查找轮廓,这个函数的原型为:

1 void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierar- 2 chy, int mode, int method, Point offset=Point()) 3  4 /* 5 参数说明: 6  7 image:输入图像image必须为一个2值单通道图像; 8  9 contours:为检测的轮廓数组,每一个轮廓用一个point类型的vector表示,vector
,则轮廓的集合可表示为vector
>;10 11 hiararchy:参数和轮廓个数相同,每个轮廓contours[i]对应hierarchy元素hierarchy[i][0]—hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,该值设置为负数;12 13 mode:轮廓的检索模式14 15 a.CV_RETR_EXTERNAL:表示只检测外轮廓16 17 b.CV_RETR_LIST:检测的轮廓不建立登记关系18 19 c.CV_RETR_CCOMP:建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。20 21 d.CV_RETR_TREE:建立一个等级树结构的轮廓。22 23 method:轮廓的近似方法24 25 a.CV_CHAIN_APPROX_NONE:存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2)),abs(y2-y1))==126 27 b.CV_CHAIN_APPROX_SIMPLE:压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息28   c.CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法offset表示代表轮廓点的偏移量,可以设置为任意值。对ROI图像中找出的轮廓,并要在整个图像中进行分析时,这个参数还是很有用的。29 */
View Code

 

  findContours后会对输入的2值图像改变,所以如果不想改变该2值图像,需创建新mat来存放,findContours后的轮廓信息contours可能过于复杂不平滑,可以用approxPolyDP函数对该多边形曲线做适当近似;contourArea函数可以得到当前轮廓包含区域的大小,方便轮廓的筛选。

  findContours函数经常与drawcontours配合使用,用来将轮廓绘制出来,函数原型为:

1  void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness=1, int lineType=8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, Point offset=Point() ) 2  3 /* 4 参数说明: 5  6 image:目标图像 7  8 contours:输入的轮廓组,每一组轮廓由点vector构成 9 10 contourIdx:指明画第几个轮廓,如果该参数为负值,则画全部轮廓11 12 color:轮廓的颜色13 14 thickness:轮廓的线宽,如果为负值或CV_FILLED表示填充轮廓内容15 16 lineType:为线型17 18 hierarchy:如果你想画出图像的一部分轮廓,那么你就需要它19 20 maxLevel:用于画轮廓的最大成,如果为0,只是画出指定轮廓,如果为1,画出第一层的所有轮廓,如果为2,画出第一和第二层的所有轮廓,依次类推,这个参数只有在有层次关系的时候被使用21 22 offset:每个轮廓点的偏移量23 24 */
View Code

  得到了复杂轮廓往往不适合特征的检测,这里再介绍一个点集凸包络的提取函数convexHull,输入参数就可以是contours组中的一个轮廓,返回外凸包络的点集。

  还可以得到轮廓的外包络矩形,使用boundingRect,函数原型为:

1 Rect boundingRect(InputArray points)2 3 //  points:二维点集4 //  返回:包围轮廓的2D矩形的模板类Rect5 //功能:对指定的点集进行包含,使得形成一个最合适的正向矩形框把当前指定的点集都框住

  如果想得到旋转的外包络矩形,使用函数minAreaRect 函数原型:

1 RotatedRect minAreaRect(InputArray points)2 //points:输入的2维向量点,其类型为:std::vector<> or Mat3 ////函数功能:为一个指定的点集计算并返回的最小边界矩形(可能旋转) 4 //返回值类型:RotatedRect

  也可以得到轮廓的外包络圆,对应的函数为minEnclosingCircle;想得到轮廓的外包络椭圆,对应的函数为fitEllipse,返回值也是RotatedRect类型,可以用ellipse函数画出对应的椭圆;

  如果想根据多边形的轮廓信息得到多边形的多阶矩,可以使用类moments

  如果想获得一点与多边形封闭轮廓信息,可以调用pointPolygonTest函数,这个函数返回值为该点距离轮廓最近边界的距离,为正值为在轮廓内部,负值为在轮廓外部,0表示在边界上。

 

Example

1 #include "opencv2/highgui/highgui.hpp" 2 #include "opencv2/imgproc/imgproc.hpp" 3 #include 
4 using namespace cv; 5 using namespace std; 6 int main() 7 { 8 9 const char* inputImage = "rice.jpg";//输入图像名称10 Mat img;11 img = imread(inputImage, 0);12 //判断图像存在与否13 if (img.empty())14 {15 cout << "Could not read input image file: " << inputImage << endl;16 return -1;17 }18 19 namedWindow("Img", 1);20 imshow("Img", img);21 //二值化,为提取轮廓做准备22 threshold(img, img, 0, 255, CV_THRESH_OTSU + CV_THRESH_BINARY);23 namedWindow("thr_img", 1);24 imshow("thr_img", img);25 //创建轮廓集合26 vector
> contours;27 //创建层级hierarchy28 vector
hierarchy;29 Mat dst = Mat::zeros(img.rows, img.cols, CV_8UC3);30 findContours(img, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);31 if (!contours.empty() && !hierarchy.empty())32 {33 int idx = 0;34 for (; idx >= 0; idx = hierarchy[idx][0])//hierarchy[idx][0]表示当前轮廓序号idx的下一个轮廓35 {36 Scalar color((rand() & 255), (rand() & 255), (rand() & 255));37 drawContours(dst, contours, idx, color, 1, 8, hierarchy);38 }39 }40 namedWindow("Connected Components", 1);41 imshow("Connected Components", dst);42 waitKey(0);43 return 0;44 }
View Code

 

转载地址:http://akovo.baihongyu.com/

你可能感兴趣的文章
(转)linux下和云端通讯的例程, ubuntu和openwrt下实验成功(二)
查看>>
hdu2707
查看>>
oralce 常用sql
查看>>
POJ 2117 (割点+连通分量)
查看>>
计算树形节点间的距离
查看>>
使用 dep 配置 golang 开发环境
查看>>
处理器管理与进程管理
查看>>
质量属性常见的六个属性场景(以淘宝网为例)
查看>>
从B树、B+树、B*树谈到R 树
查看>>
哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)D - 数圈圈
查看>>
CodeForces 738E Subordinates
查看>>
postgresql----LIKE和SIMILAR TO
查看>>
日志分析(四) Elasticsearch的精确查询
查看>>
Python编程:从入门到实践—类
查看>>
P2341 [HAOI2006]受欢迎的牛
查看>>
android mvp设计模式
查看>>
第1章 算法在计算中的作用
查看>>
IBM Minus One
查看>>
unity3d之切换场景不销毁物体
查看>>
window的cmd使用
查看>>