opencv轮廓特征1

第一个函数void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed)

该函数的功能是将轮廓做多边形近似。官方文档给出的实例链接为http://code.ros.org/svn/opencv/trunk/opencv/samples/cpp/contours.cpp,可是我打不开,郁闷。参数有4个:

   1、InputArray curve:在c++函数中,可以是std::vector或者Mat。C接口的太古老,不看了。

   2、 OutputArray approxCurve:得到的近似结果,其类型与上一个参数curve一致。C接口函数中还需要事先分配内存管理器,c++接口没这么麻烦了。

   3、double epsilon:指定近似精度的参数。意义是原始curve和近似得到的curve之间的最大距离。opencv官方文档给出了说明:Douglas-Peucker algorithm http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm,暂时没看。

   4、bool closed:指定轮廓是否闭合。true代表闭合,即轮廓第一个点和最后一个点事相邻的。


第二个函数double arcLength(InputArray curve, bool closed)

该函数的功能是计算轮廓长度。官方文档给出的参数closed说明语焉不详。


第三个函数 Rect boundingRect(InputArray points)

该函数的功能是返回包含轮廓的最小外接矩形,文档中的说明是 minimal up-right bounding rectangle,暂时理解up-right为正矩形吧


第四个函数 double contourArea(InputArray contour, bool oriented=false )

该函数的功能是计算轮廓面积。第一个参数不解释,第二个参数:

    bool oriented=false:面积的方向标志。如果为true,函数返回带符号的面积值,符号取决于轮廓的方向(顺时针或逆时针)。默认值为false。

该函数其实就是计算轮廓的零阶矩,需要注意的是,该函数通过格林公式计算得到的,因此,返回的面积值或非0像素个数有可能不同,例如通过drawContours()或fillPoly()绘制轮廓。(还得看看格林公式怎么计算的面积,我去!)官方文档给出了例程代码:

vector<Point> contour;
contour.push_back(Point2f(0, 0));
contour.push_back(Point2f(10, 0));
contour.push_back(Point2f(10, 10));
contour.push_back(Point2f(5, 4));

double area0 = contourArea(contour);
vector<Point> approx;
approxPolyDP(contour, approx, 5, true);
double area1 = contourArea(approx);

cout << "area0 =" << area0 << endl <<
        "area1 =" << area1 << endl <<
        "approx poly vertices" << approx.size() << endl;

第五个函数 void convexHull(InputArray points, OutputArray hull, bool clockwise=false, bool returnPoints=true )

该函数计算轮廓的凸壳,采用的Sklansky’s algorithm,计算复杂度为O(N logN),例子convexhull.cpp。总共4个参数:

  1、InputArray points:2D的点集,存储为vector或者Mat。

  2、OutputArray hull:输出的凸壳,可以是索引的整形矢量,或者点集矢量。

  3、bool clockwise:值为true时凸壳为顺时针。

  4、bool returnPoints:当输入为矩阵时,如果此标志位为true,该函数输出凸壳点集;否则,输出凸壳点集的索引。

你可能感兴趣的:(qt+opencv)