【问题标题】:Is "InputArray" and "Mat" the same in opencv?opencv中的“InputArray”和“Mat”是否相同?
【发布时间】:2015-08-05 06:17:29
【问题描述】:

例如在文档中有:

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;
}

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    来自OpenCV doc

    这是将只读输入数组传递给 OpenCV 函数的代理类。 定义为:

    typedef const _InputArray& InputArray;
    

    其中_InputArray 是可以从MatMat_&lt;T&gt;Matx&lt;T, m, n&gt;std::vector&lt;T&gt;std::vector&lt;std::vector&lt;T&gt; &gt;std::vector&lt;Mat&gt; 构造的类。它也可以由矩阵表达式构造。

    由于这主要是实现级别的类,并且它的接口在未来的版本中可能会发生变化,我们不再详细描述它。不过,有一些关键的事情应该牢记在心:

    当您在参考手册或 OpenCV 源代码中看到一个采用 InputArray 的函数时,这意味着您实际上可以传递 MatMatxvector&lt;T&gt; 等(参见上面的完整列表) .

    可选输入参数:如果某些输入数组可能为空,请传递cv::noArray()(或者像以前一样简单地传递cv::Mat())。 该类仅用于传递参数。也就是说,通常你不应该声明这种类型的类成员、局部和全局变量。 如果您想设计自己的函数或可以操作多种类型数组的类方法,您可以使用InputArray(或OutputArray)作为相应的参数。在函数内部,您应该使用_InputArray::getMat() 方法为数组构造一个矩阵头(不复制数据)。 _InputArray::kind() 可用于区分Matvector&lt;&gt; 等,但通常不需要。

    因此,如果您需要您的函数可以同时接受cv::Matstd::vector&lt;&gt;,请使用InputArray,否则只需使用cv::Mat

    当然,不要使用Mat*

    【讨论】:

    • 是的,使用 const Mat& 作为输入,您甚至可以避免复制 Mats 的标题。您也可以将 dst 作为 Mat& 的参数,并返回 void
    • 非常详细的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多