对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的模板类对象
通过追踪源代码,我们可以发现,其实Ptr是OpenCV中已经定义好的类模板,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这个接口类可以是Mat、Mat_<T>、vector<T>、vector<vector<T>>、vector<Mat> 等多种类型。
尤其这一句
_InputArray(const vector<Mat>& vec);
可以发现之前使用的vector<Mat> 正好对应了这个拷贝构造函数,因此可以在自己编写的函数中形参也用_InputArray,可以传递多类型的参数,在函数的内部可以使用_InputArray::getMat()函数将传入的参数转换为Mat的结构,方便函数内的操作。
- 对FaceRecognizer类的一点分析
- 对我自己的一点分析总结
- 对灵活性分析的一点心得
- 对系统需求分析的一点看法
- Opencv中的FaceRecognizer类
- FaceRecognizer
- FaceRecognizer
- 对PECompact加壳的DLL脱壳的一点分析
- Android多媒体分析(六)对AudioManager的一点补充
- Android多媒体分析(六)对AudioManager的一点补充
- Android多媒体分析(六)对AudioManager的一点补充
- Android多媒体分析(六)对AudioManager的一点补充
- Android多媒体分析(六)对AudioManager的一点补充
- Android多媒体分析(六)对AudioManager的一点补充
- 对BAT近期招聘职位的一点分析总结
- 稍微对String类的一点改进
- 对Abstract类的一点理解
- 【opencv小应用】Opencv FaceRecognizer类的简单使用(MFC)
- 浅谈外存分配的几种方式
- Cocos2d-x(八)动作类CCAction
- 创建你的首个 DOCKER 容器
- 其他视图控制器及控件
- 小柒入住这里
- 对FaceRecognizer类的一点分析
- 集群瓶颈:磁盘IO必读
- QML类型说明-FontDialog
- shell浅谈之五文本处理工具Vim
- Allegro中删除安装孔
- Java 线程池学习-简介
- 你是想读书,还是想读完书?
- 在Linux Mint 上安装iBus 中文输入法
- Error : getaddrinfo ENOTFOUND in node.js