本文地址http://blog.csdn.net/mounty_fsc/article/details/51085201
1. 关于InputArray的代理类
在OpenCV经常有InputArray作为函数形参的使用,而实参往往是Mat,vector等,乍一看以为是Mat类实现了抽象类或者接口InputArray,分析源码之后,可以得知InputArray(_InputArray)、OutputArray(_OutputArray)与Mat、Vector、Scalar等的关系。
class CV_EXPORTS _InputArray
{
public:
...
_InputArray(const Mat& m);
_InputArray(const MatExpr& expr);
template<typename _Tp> _InputArray(const _Tp* vec, int n);
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);
template<typename _Tp, int m, int n> _InputArray(const Matx<_Tp, m, n>& matx);
_InputArray(const Scalar& s);
_InputArray(const double& val);
...
int flags;
void* obj;
Size sz;
};
例如函数调用:
MatI, padded;
copyMakeBorder(I,padded, …);
//其函数声明:
voidcopyMakeBorder( InputArray src, OutputArray dst,…..);
其中代理类中有成员变量void* obj;通过不同的构造方法给obj赋值
作用有:
1. 把不相关的类(比如说用户自定义的类和系统类)实现了类似多态的效果
2. 函数声明,一眼可以看出哪些是输入,哪些是输出
3. 方便动态内存管理