aihot  2017-05-07 07:51:05  OpenCV |   查看评论   
8 Point pt2((*it)[2],(*it)[3]); 9 line(image,pt1,pt2,color,2); // 线条宽度设置为2 10 ++it; 11 } 12 }
OpenCV成长之路(8):直线、轮廓的提取与描述

 

实际上Hough变换可以检测很多固定的形状,比如:圆、正方形等。它们的原理基本相同,都是构造一个投票矩阵。OpenCV里提供了检测圆的函数HoughCircles,它的输出是一个Vector of Vec3i,Vector的每个元素包含了3个浮点数,前2个是圆的中心坐标,最后一个是半径。

三、轮廓的提取与描述

在目标识别中我们首先要把感兴趣的目标提取出来,而一般常见的步骤都是通过颜色或纹理提取出目标的前景图(一幅黑白图像,目标以白色显示在图像中),接下来我们要对前景图进行分析进一步地把目标提取出来,而这里常常用到的就是提取目标的轮廓。

OpenCV里提取目标轮廓的函数是findContours,它的输入图像是一幅二值图像,输出的是每一个连通区域的轮廓点的集合:vector<vector<Point>>。外层vector的size代表了图像中轮廓的个数,里面vector的size代表了轮廓上点的个数。下面我们通过实例来看函数的用法。

 1 int main()  2   {  3       using namespace cv;  4   
 5       Mat image=imread("../shape.png");  6       cvtColor(image,image,CV_BGR2GRAY);  7      vector<vector<Point>> contours;  8      // find
 9      findContours(image,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE); 10     // draw
11      Mat result(image.size(),CV_8U,Scalar(0)); 12      drawContours(result,contours,-1,Scalar(255),2); 13  
14      namedWindow("contours"); 15      imshow("contours",result); 16      waitKey(); 17      return 0; 18 }
OpenCV成长之路(8):直线、轮廓的提取与描述

 

上面程序中包含了2个函数,第一个是查找轮廓函数,它的第三个参数说明查找轮廓的类型,这里我们使用的是外轮廓,还可以查找所有轮廓,即包括一些孔洞的部分,像图像人物胳膊与腰间形成的轮廓。第4个参数说明了轮廓表示的方法,程序中的参数说明轮廓包括了所有点,也可以用其他参数让有点直线的地方,只保存直线起始与终点的位置点,具体参数用法可以参考手册里函数的介绍。

第二个函数drawContours是一个画轮廓的函数,它的第3个参数程序里设置-1表示所有的轮廓都画,你也可以指定要画的轮廓的序号。

提取到轮廓后,其实我们更关心的是如果把这些轮廓转换为可以利用的特征,也就是涉及到轮廓的描述问题,这时就有多种方法可以选择,比如矢量化为多边形、矩形、椭圆等。OpenCV里提供了一些这样的函数。

 1 // 轮廓表示为一个矩形
 2 Rect r = boundingRect(Mat(contours[0]));             
          
 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自OpenCV成长之路(8):直线、轮廓的提取与描述

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]