CvStatModel、CvBoost、CvCascadeBoost源码解析之CvStatModel

来源:互联网 发布:彩神软件靠谱吗 编辑:程序博客网 时间:2024/06/06 06:47

    CvStatModel的Stat是统计(statistics)的缩写,顾名思义,它表示的是统计模型,在opencv的machine learning模块中,它就是统计模型的基类。而adaboost算法作为boost算法中的一种,自然而然也是以CvStatModel作为基类的了。CvStatModel类的声明如下:

class CV_EXPORTS_W CvStatModel{public:    //默认的无参构造函数,只做了一件事:把default_model_name赋值为"my_stat_model"    CvStatModel();    //虚析构函数,因为类中有虚函数,所以析构函数也必须为虚,也只做了一件事,就是调用了clear()函数    virtual ~CvStatModel();    //这个函数在定义中什么都没做,我的理解是作者的目的是想继承它的类自己override自己类版本的clear函数,作用是释放内存,重置模型状态。    virtual void clear();    //后面四个函数在下文中详细说明    CV_WRAP virtual void save( const char* filename, const char* name=0 ) const;    CV_WRAP virtual void load( const char* filename, const char* name=0 )    virtual void write( CvFileStorage* storage, const char* name ) const;    virtual void read( CvFileStorage* storage, CvFileNode* node );protected:    const char* default_model_name;};

    CvStatModel类中有四个读写的函数,其定义如下:

void CvStatModel::save( const char* filename, const char* name ) const{    //指向文件的指针    CvFileStorage* fs = 0;    //CV_FUNCNAME是一个宏定义,跟实际算法无关不用理会    CV_FUNCNAME( "CvStatModel::save" );    //__BEGIN__是宏定义,表示{    __BEGIN__;    //CV_CALL,表示执行括号内的指令并检查运行状态,所以这里就是打开了一个名为filename的文件用作写的目的    CV_CALL( fs = cvOpenFileStorage( filename, 0, CV_STORAGE_WRITE ));    //如果打开失败则报错    if( !fs )        CV_ERROR( CV_StsError, "Could not open the file storage. Check the path and permissions" );    //这里的write没有做实际的事情,虽然看起来像是往文件里面写入了模型的名字。因它是虚函数,所以继承者可以根据自己需要重写write    write( fs, name ? name : default_model_name );    //__END__是宏定义,表示goto exit; exit: ; }    __END__;    //释放文件指针    cvReleaseFileStorage( &fs );}void CvStatModel::load( const char* filename, const char* name ){    //定义指向文件的指针    CvFileStorage* fs = 0;    //CV_FUNCNAME是一个宏定义,跟实际算法无关不用理会    CV_FUNCNAME( "CvStatModel::load" );    //宏定义,前面说过了    __BEGIN__;    CvFileNode* model_node = 0;    //打开名为filename的文件用作读的目的    CV_CALL( fs = cvOpenFileStorage( filename, 0, CV_STORAGE_READ ));    //如果打开失败就退出    if( !fs )        EXIT;    //如果name不为空就从文件中读出名为name的节点    if( name )        model_node = cvGetFileNodeByName( fs, 0, name );    else    {        //如果name为空则开始获取根节点        CvFileNode* root = cvGetRootFileNode( fs );        //这里不是太明白        if( root->data.seq->total > 0 )            model_node = (CvFileNode*)cvGetSeqElem( root->data.seq, 0 );    }    //这里的read没有做实际的事情,虽然看起来像是往文件里面读取了节点的内容。因它是虚函数,所以继承者可以根据自己需要重写read    read( fs, model_node );    //宏定义,前面说过了    __END__;    //释放文件指针    cvReleaseFileStorage( &fs );}void CvStatModel::write( CvFileStorage*, const char* ) const{    //源码里面只是设置了一个异常处理,没有做实际的事情    OPENCV_ERROR( CV_StsNotImplemented, "CvStatModel::write", "" );}void CvStatModel::read( CvFileStorage*, CvFileNode* ){    //源码里面只是设置了一个异常处理,没有做实际的事情    OPENCV_ERROR( CV_StsNotImplemented, "CvStatModel::read", "" );}

    小结:CvStatModel类更像是一个基本准则,指出了继承此类的统计学习模型应该具备的几个基本的功能,但实际这个类并没有做什么事情。

原创粉丝点击