C++ 编写接受cv::Mat或cv::UMat类型输入的模板函数
编写接受Mat或UMat类型输入参数的函数的最简单、最干净的方法是什么 我应该使用InputArray、使用模板还是有更好的替代方案?我目前拥有为Mat和UMat编写的具有相同实现的函数 该函数应充分利用UMat对OpenCL的抽象,运行速度大致与仅为UMat编写的一样快,且无需将UMat复制到Mats的开销 我想为Mat和UMat定义的函数示例如下(请不要建议重构以删除本地Mat/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
根据@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);
返回;
}
优点:
- 根据输入类型,很容易声明本地
s或Mat
sUMat
- 无
⟷ <代码>UMat转换Mat
- 所有矩阵参数必须为同一类型,不能混合使用
s和Mat
sUMat
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]
}