opencv中的"InputArray"和"Mat"是否相同?

use*_*398 12 c++ opencv

例如,在文档中有:

void cv::absdiff    (   InputArray      src1,
        InputArray      src2,
        OutputArray     dst 
    ) 
Run Code Online (Sandbox Code Playgroud)

这是一样的:

void cv::absdiff    (   Mat     src1,
            Mat     src2,
            Mat     dst 
        ) 
Run Code Online (Sandbox Code Playgroud)

要么:

void cv::absdiff    (   Mat*    src1,
            Mat*    src2,
            Mat*    dst 
        ) 
Run Code Online (Sandbox Code Playgroud)

我需要这个来创建新的功能,例如

void absDiffSay(XXX src1, XXX src2, XXX dst)
{
  cv::absdiff(src1,src2,dst);
  cout<<"absdiff"<<endl;
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*iki 23

来自OpenCV doc

这是用于将只读输入数组传递到OpenCV函数的代理类.它被定义为:

typedef const _InputArray& InputArray;
Run Code Online (Sandbox Code Playgroud)

其中_InputArray是可以从构成一类Mat,Mat_<T>,Matx<T, m, n>,std::vector<T>,std::vector<std::vector<T> >std::vector<Mat>.它也可以用矩阵表达式构造.

由于这主要是实现级别的类,并且其接口在将来的版本中可能会更改,因此我们不会详细描述它.但是,有一些关键的事情应该牢记在心:

当你在参考手册中或在OpenCV中的源代码,需要一个函数看到InputArray,这意味着你可以实际传递Mat,Matx,vector<T>等(参见完整列表上文).

可选的输入参数:如果某些输入数组可能为空,则传递cv::noArray()(或者cv::Mat()就像之前可能做的那样).该类仅用于传递参数.也就是说,通常您不应声明此类型的类成员,本地和全局变量.如果要设计自己的函数或可以操作多种类型数组的类方法,可以使用InputArray(或OutputArray)各自的参数.在函数内部,您应该使用_InputArray::getMat()方法为数组构造矩阵标头(不复制数据)._InputArray::kind()可用于区分Matvector<>等,但通常是不需要的.

因此,如果您需要,您的功能可以接受cv::Matstd::vector<>使用InputArray,否则使用简单cv::Mat.

当然,不要使用Mat*.