zoukankan      html  css  js  c++  java
  • OpenCV 轮廓基本特征

     http://blog.csdn.net/tiemaxiaosu/article/details/51360499

    OpenCV 轮廓基本特征

     分类:

    一、概述

           我们通过cvFindContours( )函数获取得图像轮廓有何作用呢?一般来说,我们对轮廓常用的操作有识别和处理,另外相关的还有多种对轮廓的处理,如简化或拟合轮廓,匹配轮廓到模板,等等。

            我们在轮廓处理中经常需要对轮廓变化一些特征进行概括,比如长度或者一些反映轮廓整体大小的度量。另外轮廓矩也是概括轮廓的特征的重要方法。

    二、常见特征函数

    1、多边形逼近

    CvSeq* cvApproxPoly( const void* src_seq, int header_size, CvMemStorage* storage,
                                          int method, double parameter, int parameter2=0 );
    src_seq 

        点集数组序列 
    header_size 
        逼近曲线的头尺寸 
    storage 
        逼近轮廓的容器。如果为 NULL, 则使用输入的序列 
    method 
        逼近方法。目前仅支持 CV_POLY_APPROX_DP , 对应 Douglas-Peucker 算法
    parameter 
        方法相关参数。对 CV_POLY_APPROX_DP 它是指定的逼近精度 
    parameter2 
        如果 src_seq 是序列,它表示要么逼近单个序列,要么在 src_seq 的同一个或低级层次上逼近所有序列 (参考 cvFindContours 中对轮廓继承结构的描述). 如果 src_seq 是点集的数组 (CvMat*) , 参数指定曲线是闭合 (parameter2!=0) 还是非闭合 (parameter2=0).
            函数 cvApproxPoly 逼近一个或多个曲线,并返回逼近结果。对多个曲线的逼近,生成的树将与输入的具有同样的结构。(1:1 的对应关系). 当我们绘制一个多边形或者进行形状分析的时候,通常需要使用多边形逼近一个轮廓,使得顶点数目变少。

    2、计算轮廓周长或曲线长度

    double cvArcLength( const void* curve, CvSlice slice=CV_WHOLE_SEQ, int is_closed=-1 );
    curve 
        曲线点集序列或数组 
    slice 
       曲线的起始点,缺省是计算整个曲线的长度 
    is_closed 
       表示曲线是否闭合,有三种情况: 
    is_closed=0 - 假设曲线不闭合 
    is_closed>0 - 假设曲线闭合 
    is_closed<0 - 若曲线是序列,检查 ((CvSeq*)curve)->flags 中的标识 CV_SEQ_FLAG_CLOSED 来确定曲线是否闭合。否则 (曲线由点集的数组 (CvMat*) 表示) 假设曲线不闭合。
    函数 cvArcLength 通过依次计算序列点之间的线段长度,并求和来得到曲线的长度。

    3、计算整个轮廓或部分轮廓的面积

    double cvContourArea( const CvArr* contour, CvSlice slice=CV_WHOLE_SEQ );
    

    contour

        轮廓 (边界点的序列或数组).

    slice

        感兴趣轮廓部分的起始点,缺省是计算整个轮廓的面积。

        函数 cvContourArea 计算整个轮廓或部分轮廓的面积。 对后面的情况,面积表示轮廓部分和起始点连线构成的封闭部分的面积。如下图所示:

     

    备注: 轮廓的方向影响面积的符号。因此函数也许会返回负的结果。应用函数 fabs() 得到面积的绝对值。

    4、计算点集的最外面(up-right)矩形边界

    CvRect cvBoundingRect( CvArr* points, int update=0 );
    points 
        二维点集,点的序列或向量 (CvMat) 
    update 
       更新标识。下面是轮廓类型和标识的一些可能组合: 
    update=0, contour ~ CvContour*: 不计算矩形边界,但直接由轮廓头的 rect 域得到。
    update=1, contour ~ CvContour*: 计算矩形边界,而且将结果写入到轮廓头的 rect 域中 header. 
    update=0, contour ~ CvSeq* or CvMat*: 计算并返回边界矩形 
    update=1, contour ~ CvSeq* or CvMat*: 产生运行错误 (runtime error is raised) 
    函数 cvBoundingRect 返回二维点集的最外面 (up-right)矩形边界。

    5、对给定的 2D 点集,寻找最小面积的包围矩形

    CvBox2D cvMinAreaRect2( const CvArr* points, CvMemStorage* storage=NULL );
    

    points

       点序列或点集数组

    storage

       可选的临时存储仓

    函数 cvMinAreaRect2 通过建立凸外形并且旋转外形以寻找给定 2D 点集的最小面积的包围矩形。这个长方形很有可能是倾斜的。

      

    6、对给定的 2D 点集,寻找最小面积的包围圆形

    int cvMinEnclosingCircle( const CvArr* points, CvPoint2D32f* center, float* radius );
    points 
        点序列或点集数组 
    center 
        输出参数:圆心 
    radius 
        输出参数:半径 
        函数 cvMinEnclosingCircle 对给定的 2D 点集迭代寻找最小面积的包围圆形。如果产生的圆包含所有点,返回非零。否则返回零(算法失败)。

    7、二维点集的椭圆拟合

    CvBox2D cvFitEllipse2( const CvArr* points );
    points 
         点集的序列或数组 
         函数 cvFitEllipse 对给定的一组二维点集作椭圆的最佳拟合(最小二乘意义上的)。返回的结构与 cvEllipse 中的意义类似,除了 size 表示椭圆轴的整个长度,而不是一半长度。

         

    8、对两个给定矩形,寻找矩形边界

    CvRect cvMaxRect( const CvRect* rect1, const CvRect* rect2 );
    

    rect1

       第一个矩形

    rect2

      第二个矩形

    函数 cvMaxRect 寻找包含两个输入矩形的具有最小面积的矩形边界。

      

    9、寻找盒子的顶点

    void cvBoxPoints( CvBox2D box, CvPoint2D32f pt[4] );
    box 盒子 
    pt  顶点数组 
    函数 cvBoxPoints 计算输入的二维盒子的顶点。

    10、测试点是否在多边形中

    double cvPointPolygonTest( const CvArr* contour, CvPoint2D32f pt, int measure_dist );

    contour

           输入轮廓.

    pt

           针对轮廓需要测试的点。

    measure_dist

           如果非0,函数将估算点到轮廓最近边的距离。

           函数cvPointPolygonTest 决定测试点是否在轮廓内,轮廓外,还是轮廓的边上(或者共边的交点上),它的返回值是正负零,相对应的,当measure_dist=0时,返回值是1, -1,0, 同样当 measure_dist≠0 ,它是返回一个从点到最近的边的带符号距离。

  • 相关阅读:
    第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海)M . Gitignore(模拟)
    11.FreeRTOS延时函数
    10.FreeRTOS任务通知的简易分析
    9.FreeRTOS内存管理简易分析
    8. FreeRTOS信号量的简易分析
    7.FreeRTOS 队列的简易分析
    6. FreeRTOS任务调度
    5.FreeRTOS任务切换的简易分析
    4.FreeRTOS调度器的启动简易分析
    3.FreeRTOS任务的简易分析
  • 原文地址:https://www.cnblogs.com/carl2380/p/6101522.html
Copyright © 2011-2022 走看看