(OpenCV)笔记汇总

本文地址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. 方便动态内存管理

你可能感兴趣的:(opencv)