opencv中的“InputArray”和“Mat”是否相同?

时间:2015-08-04 21:57:18

标签: c++ opencv

在文档中,例如:

void cv::absdiff    (   InputArray      src1,
        InputArray      src2,
        OutputArray     dst 
    ) 

是否与:

相同
void cv::absdiff    (   Mat     src1,
            Mat     src2,
            Mat     dst 
        ) 

或:

void cv::absdiff    (   Mat*    src1,
            Mat*    src2,
            Mat*    dst 
        ) 

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

void absDiffSay(XXX src1, XXX src2, XXX dst)
{
  cv::absdiff(src1,src2,dst);
  cout<<"absdiff"<<endl;
}

1 个答案:

答案 0 :(得分:22)

来自OpenCV doc

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

 <?xml version=\"1.0\" encoding=\"UTF-8\"?>
 <Ist xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"     xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
    <Credit>
<LoanApp>
  <Routing Transaction=\"LoanApp\">
    <Processing>
      <Process Type=\"Trans-type\">pass</Process>
    </Processing>
    <From>
      <IDs>
        <ID Type=\"Network\">WEBSITE</ID>
        <ID Type=\"WEB\">WEBSITE</ID>
        <ID Type=\"D\">4054563</ID>
      </IDs>

其中typedef const _InputArray& InputArray; 是可以从_InputArrayMatMat_<T>Matx<T, m, n>std::vector<T>或{{1}构建的类}}。它也可以用矩阵表达式构建。

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

当您在参考手册或OpenCV源代码中看到一个采用std::vector<std::vector<T> >的函数时,这意味着您实际上可以通过std::vector<Mat>InputArrayMat等。(见上面的完整清单)。

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

因此,如果您需要,您的功能可以接受Matvector<>使用cv::Mat,否则只需使用std::vector<>

当然,使用InputArray