编写接受Mat或UMat类型的输入参数的函数的最简单,最简洁的方法是什么?

我应该使用InputArray,使用模板还是有更好的选择?我对具有针对Mat和UMat编写的具有相同实现的函数感到不满意。

该功能应充分利用UMat抽象(优于OpenCL),并且运行速度与仅为UMat编写的速度大致相同,并且不必将UMats复制到Mats。

下面是我想为Mat和UMat定义的函数示例(请不要提出重构以删除本地Mat / UMat变量,这只是一个示例)

using namespace cv;

void foo(const Mat & in1, const Mat & in2, Mat & out)
{
    Mat aux1;
    Mat aux2;
    exp(in1, aux1);
    exp(in2, aux2);
    add(aux1, aux2, out);
    return;
}

void foo(const UMat & in1, const UMat & in2, UMat & out)
{
    UMat aux1;
    UMat aux2;
    exp(in1, aux1);
    exp(in2, aux2);
    add(aux1, aux2, out);
    return;
}

最佳答案

我使用了一个模板:

using namespace cv;

// MatType is either cv::Mat or cv::UMat.
template<typename MatType>
void foo(const MatType& in1, const MatType& in2, MatType& out)
{
    MatType aux1;
    MatType aux2;
    exp(in1, aux1);
    exp(in2, aux2);
    add(aux1, aux2, out);
    return;
}

好处:
  • 根据输入类型,很容易声明本地MatUMat
  • 没有MatUMat转换。

  • 坏处:
  • 所有矩阵参数必须具有相同的类型,不能将MatUMat混合使用。
  • 关于c++ - 编写模板函数,接受cv::Mat或cv::UMat类型的输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52180318/

    10-11 16:23