opencv学习之路

来源:互联网 发布:ac尼尔森数据 奶 2015 编辑:程序博客网 时间:2024/05/17 21:45

使用opencv已有两年有余但是始终无法真正深入的了解opencv,因此决定从现在开始完成的记录在使用opencv中所遇到的问题以及解决方法,以对自己所掌握的内容做个总结。

findContours

C++: void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point())

参数说明:

  • image–需要处理的二值化图片。

  • contours–描述轮廓的点的集合其数据结

    std::vector<std::vector<cv::Point>>
    每一个轮廓都是点的集合,每一张二值化的图片又会包含多个轮廓信息。
    hierarchy– contours的信息描述每一个轮廓都会对应一个hierarchy,例:contours[i]其对应hierarchy[i][0],hierarchy[i][1],hierarchy[i][2],hierarchy[i][3].
    hierarchy[i][0],hierarchy[i][0]指与该轮廓同一级别的下一个轮廓和前一个轮廓。hierarchy[i][2],hierarchy[i][3]表示父轮廓和内嵌轮廓,如果没有则该值为-1.

  • mode–

    CV_RETR_EXTERNAL 仅仅检测外部轮廓。设置每一个轮廓的 hierarchy[i][2]=hierarchy[i][3]=-1.
    CV_RETR_LIST 检测所有的轮廓但是并不建立等级关系hierarchy[i][2]=-1.
    CV_RETR_CCOMP 检测所有的轮廓并把所有的轮廓划分为两个级别。第一等级是组件的边界,第二等级是内孔的边界。如果内孔内还有一个连通轮廓,这个轮廓的边界是在第一等级。
    CV_RETR_TREE 检测所有的轮廓,而且重新建立多有内部轮廓的等级(hierarchy )。

  • method –-轮廓线的逼近方法 。

    CV_CHAIN_APPROX_NONE
    存储所有的点,相邻的两个点的距离最大为1(max(abs(x1-x2),abs(y2-y1))==1)。
    CV_CHAIN_APPROX_SIMPLE
    压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息。
    CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS 使用teh-Chinl chain
    近似算法。 offset –
    表示代表轮廓点的偏移量,可以设置为任意值。对ROI图像中找出的轮廓,并要在整个图像中进行分析时,这个参数还是很有用的。

findContours后会对输入的2值图像改变,所以如果不想改变该2值像,需创建新mat来存放,findContours后的轮廓信息contours可能过于复杂不平滑,可以用approxPolyDP函数对该多边形曲线做适当近似contourArea函数可以得到当前轮廓包含区域的大小,方便轮廓的筛选findContours经常与drawContours配合使用,用来将轮廓绘制出来。其中第一个参数image表示目标图像,第二个参数contours表示输入的轮廓组,每一组轮廓由点vector构成,第三个参数contourIdx指明画第几个轮廓,如果该参数为负值,则画全部轮廓,第四个参数color为轮廓的色,第五个参数thickness为轮廓的线宽,如果为负值或CV_FILLED表示填充轮廓内部,第六个参数lineType为线型,第七个参数为轮廓结构信息,第八个参数为maxLevel得到了复杂轮廓往往不适合特征的检测,这里再介绍一个点集凸包络的提取函数convexHull,输入参数就可以是contours组中的一个轮廓,返回外凸包络的点集还可以得到轮廓的外包络矩形,使用函数boundingRect,如果想得到旋转的外包络矩形,使用函数minAreaRect,返回值为RotatedRect;也可以得到轮廓的外包络圆,对应的函数为minEnclosingCircle;想得到轮廓的外包络椭圆,对应的函数为fitEllipse,返回值也是RotatedRect,可以用ellipse函数画出对应的椭圆如果想根据多边形的轮廓信息得到多边形的多阶矩,可以使用类moments,这个类可以得到多边形和光栅形状的3阶以内的所有矩,类内有变量m00,m10,m01,m20,m11,m02,m30,m21,m12,m03,比如多边形的质心为 x = m10 / m00,y = m01 / m00。如果想获得一点与多边形封闭轮廓的信息,可以调用pointPolygonTest函数,这个函数返回值为该点距离轮廓最近边界的距离,为正值为在轮廓内部,负值为在轮廓外部,0表示在边界上。

1 0
原创粉丝点击