Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编写接受cv::Mat或cv::UMat类型输入的模板函数_C++_Opencv_Templates_Mat - Fatal编程技术网

C++ 编写接受cv::Mat或cv::UMat类型输入的模板函数

C++ 编写接受cv::Mat或cv::UMat类型输入的模板函数,c++,opencv,templates,mat,C++,Opencv,Templates,Mat,编写接受Mat或UMat类型输入参数的函数的最简单、最干净的方法是什么 我应该使用InputArray、使用模板还是有更好的替代方案?我目前拥有为Mat和UMat编写的具有相同实现的函数 该函数应充分利用UMat对OpenCL的抽象,运行速度大致与仅为UMat编写的一样快,且无需将UMat复制到Mats的开销 我想为Mat和UMat定义的函数示例如下(请不要建议重构以删除本地Mat/UMat变量,这只是一个示例) 根据@Miki和@Gianni的建议,我们可以为一般模板类型选择Mat、Mat、M

编写接受Mat或UMat类型输入参数的函数的最简单、最干净的方法是什么

我应该使用InputArray、使用模板还是有更好的替代方案?我目前拥有为Mat和UMat编写的具有相同实现的函数

该函数应充分利用UMat对OpenCL的抽象,运行速度大致与仅为UMat编写的一样快,且无需将UMat复制到Mats的开销

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


根据@Miki和@Gianni的建议,我们可以为一般模板类型选择
Mat、Mat、Matx、std::vector、std::vector、std::vector、UMat、std::vector或double。

void func(InputArray _src1, InputArray _src2, OutputArray _dst)
{
    Mat src1 = _src1.getMat(), src2 = _src2.getMat();
    CV_Assert( src1.type() == src2.type() && src1.size() == src2.size());
    Mat aux1 = Mat(src1.size(), src1.type());
    Mat aux2 = Mat(src1.size(), src1.type());
    cv::exp(src1, aux1);
    cv::exp(src2, aux2);

    _dst.create(src1.size(), src1.type());
    Mat dst = _dst.getMat();
    cv::add(aux1, aux2, dst);
}
现在您可以使用
Mat
UMat
甚至
std::vector

int test(){
    std::vector<float> vec1 = {1,2,3};
    std::vector<float> vec2 = {3,2,1};
    std::vector<float> dst;

    func(vec1, vec2, dst);
    // now dst is [22.8038, 14.7781, 22.8038]

}
int测试(){
向量vec1={1,2,3};
向量vec2={3,2,1};
std::向量dst;
func(vec1、vec2、dst);
//现在dst是[22.8038,14.7781,22.8038]
}
我使用了一个模板:

使用名称空间cv;
//MatType为cv::Mat或cv::UMat。
模板
void foo(常量MatType&in1,常量MatType&in2,MatType&out)
{
MatType aux1;
mattypeaux2;
exp(in1,aux1);
exp(in2,aux2);
添加(aux1,aux2,out);
返回;
}
优点:

  • 根据输入类型,很容易声明本地
    Mat
    s或
    UMat
    s
  • Mat
    ⟷ <代码>UMat转换
缺点:

  • 所有矩阵参数必须为同一类型,不能混合使用
    Mat
    s和
    UMat
    s

您可以像使用所有OpenCV功能一样使用这是最方便的选项吗?我读到“这个类是专门为传递参数而设计的。也就是说,通常你不应该声明这个类型的类成员、局部变量和全局变量。”。我的函数根据输入类型声明/使用本地Mats/UMAT请提供一些代码示例。“最方便”并不是很好的定义。对我来说,它看起来像一个经典的模板。我突然意识到,也许它不适合
GpuMat
。但我没有测试+1,因为它实际上是有效的。但我想利用UMat抽象:在这里,我的UMat将转换为Mats,exp()和add()调用将在CPU中运行。我也不希望通过.getMat()调用将内存从设备移动到主机,因为这可能意味着额外的处理开销。我将编辑我的问题,因为它可能不清楚
int test(){
    std::vector<float> vec1 = {1,2,3};
    std::vector<float> vec2 = {3,2,1};
    std::vector<float> dst;

    func(vec1, vec2, dst);
    // now dst is [22.8038, 14.7781, 22.8038]

}