Opencv:是否有一种标准/正确的方法来返回matrx和return参数

时间:2018-06-02 18:43:21

标签: c++ opencv

据我了解,返回Mat是危险的,因为对这样一个函数的调用可能是一个临时变量(在表达式中),因此函数中创建的Mat的数据ptr将在之前释放。评估使用它的临时表达式。

所以,据我所知,下面的代码是一个问题,因为函数M“拥有”M,在它的堆栈上,当它返回时,返回M的浅拷贝,但M的数据指针被释放。因此,A = fred()+ fred()应该崩溃,因为加法运算符正在处理fred的具有无效内存指针的临时返回。 (右?)

Mat fred() {
 Mat M=Mat::zeros(5,5,CV_32F);
 return(M);
}

Mat A = fred() + fred(); 

据我所知,MatExpr是为了解决这个问题而做的。事实上,从另一篇文章中,这里是转置函数的“表达形式”的实现:

MatExpr MatExpr::t() const
{
  MatExpr e;
  op->transpose(*this, e);
  return e;
}

那么,这是t(),一个通用的(标准的/适当的)方法,用于如何制作具有Mat“return”参数的任何非表达式函数的表达式形式(如上面的转置)? /强>
它只是简单地创建一个MatExpr,一个Mat,堆栈变量,并用它来代替一个Mat来调用非表达式吗?

请注意,转置函数的返回参数类型为OutputArray而不是Mat。我承认我不明白两者之间究竟有什么区别;什么时候使用一个与另一个。我倾向于写函数,返回参数是Mat别名(例如Mat& Dest)。 我可以使用Mat参数调用此类函数,还是仅使用我使用过OutputArray?(例如,如果opencvs使用Mat& vs OutputArray转置第2个arg,则上面定义的函数t()仍然有效?)

修改

我没有注意到op->转置中的操作。怎么样:

给定带有“return”参数的函数

void f(<input args>, Mat &OutputMatrix)
{
     .... // OutputMatrix = whatever.
}

通过以下方式创建一个实际等效的返回形式:

MatExpr f(<input args>) 
{
    Mat Out;
    f(<input args>,Out);
    return(MatExpr(Out)); // is this generally OK for an expression using f?
}

我看到OpenCV代码使用OutputArray vs Mat&amp;但我不明白为什么等等。

0 个答案:

没有答案