对FaceRecognizer类的一点分析

来源:互联网 发布:unity3d手游加速器 编辑:程序博客网 时间:2024/06/07 13:33

先上代码,FaceRecognizer类的声明

class CV_EXPORTS_W FaceRecognizer : public Algorithm{    public:        //! virtual destructor        virtual ~FaceRecognizer() {}        // Trains a FaceRecognizer.        CV_WRAP virtual void train(<strong>InputArrayOfArrays</strong> src, InputArray labels) = 0;};

为了清楚一点,上面声明中删去了部分代码,只保留了有限的内容

opencv 提供的示例中截取出如下代码:

详情可参考sources\modules\contrib\doc\facerec\src下的facerec_fisherfaces.cpp文件

vector<Mat> images;vector<int> labels;......Ptr<FaceRecognizer> model = createFisherFaceRecognizer();model->train(images, labels);

首先声明了一个Ptr<FaceRecognizer> model的模板类对象

通过追踪源代码,我们可以发现,其实PtrOpenCV中已经定义好的类模板,OpenCV重载了Ptr的许多运算符,使得可以灵活的使用这个容器。由于Ptr容器已经重载了 -> 运算符,使得我们通过Ptr< >容器建立的变量对象,拥有可以访问其内部类型FaceRecognizer 对象的成员函数的能力。

源码如下,同样删去了其他代码,只保留了部分。

template<typename _Tp> class Ptr{public:    //! helper operators making "Ptr<T> ptr" use very similar to "T* ptr".    _Tp* operator -> ();    const _Tp* operator -> () const;};

继续观察上面的代码,可以发现train( )函数接收的参数是InputArrayOfArrays 类型的对象,在core.hpp中有相关的typedef,如下所示:

typedef const _InputArray& InputArray;typedef InputArray InputArrayOfArrays;

最终我们可以发现其实 InputArrayOfArrays 最终还是转到_InputArray 类型上了,查看_InputArray类的声明,如下所示:

同样删去了部分代码

class CV_EXPORTS _InputArray{public:    _InputArray();    _InputArray(const Mat& m);    template<typename _Tp> _InputArray(const vector<_Tp>& vec);    template<typename _Tp> _InputArray(const vector<vector<_Tp> >& vec);    _InputArray(const vector<Mat>& vec);    template<typename _Tp> _InputArray(const vector<Mat_<_Tp> >& vec);    template<typename _Tp> _InputArray(const Mat_<_Tp>& m);    virtual Mat getMat(int i=-1) const;};

根据上面的代码,可以发现_InputArray这个类中重载了多个拷贝构造函数,其中不少利用模板函数。_InputArray这个接口类可以是MatMat_<T>vector<T>vector<vector<T>>vector<Mat> 等多种类型。

尤其这一句

_InputArray(const vector<Mat>& vec);

可以发现之前使用的vector<Mat> 正好对应了这个拷贝构造函数,因此可以在自己编写的函数中形参也用_InputArray,可以传递多类型的参数,在函数的内部可以使用_InputArray::getMat()函数将传入的参数转换为Mat的结构,方便函数内的操作


0 0
原创粉丝点击