据我了解,返回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;但我不明白为什么等等。