我有一个函数resizeToShortSide,它接受Mat并将其短边调整为指定值。要调整大小,我设置目标垫,resizedMat,执行调整大小,然后将resizedMat分配给输入Mat,mat。这成功发生。
然而,当函数结束时,传递给函数的Mat也是它的原始大小,好像没有发生对resizedMat的赋值! OpenCv Mat总是通过引用传递,所以我不确定它为什么表现得像Mat的副本正在传递。这是有问题的功能......
void resizeToShortSide(Mat mat, int shortSide, int resamplingMethod)
{
//determine which side is the short side
bool shortSideIsRows;
if (mat.rows <= mat.cols) {
shortSideIsRows = true;
} else {
shortSideIsRows = false;
}
//caluculate the size of the long side
Size outputSize;
if (shortSideIsRows) {
int cols = (shortSide / (float) mat.rows) * mat.cols;
int rows = shortSide;
outputSize = Size(cols, rows);
} else {
int rows = (shortSide / (float) mat.cols) * mat.rows;
int cols = shortSide;
outputSize = Size(cols, rows);
}
//setup a destination mat
Mat resizedMat(outputSize, CV_8UC4);
//resize
if (resamplingMethod == BashSettings::ResamplingMethod::NearestNeighbor)
resize(mat, resizedMat, outputSize, 0, 0, INTER_NEAREST);
else
resize(mat, resizedMat, outputSize); //defaults to INTER_LINEAR
//assign mat to resized mat
mat = resizedMat;
qDebug() << "resize to short side " << shortSide;
qDebug() << "resized mat width, height " << resizedMat.cols << ", " << resizedMat.rows;
qDebug() << "input mat width, height " << mat.cols << ", " << mat.rows;
qDebug() << " ";
}
答案 0 :(得分:1)
Mat
类本身包含一些&#34;标题信息&#34;以及指向UMatData
对象的指针。 UMatData
处理引用计数。不幸的是,MatSize size
定义位于Mat
对象中。由于您的函数resizeToShortSide
的值为Mat
,因此您的函数返回后无法更新大小。您仍然需要通过引用传递Mat
。以下是Mat
类定义的相关部分:
class CV_EXPORTS Mat
{
...
//! interaction with UMat
UMatData* u;
MatSize size;
MatStep step;
...
}
请注意,cv::resize
函数是使用InputArray
和OutputArray
参数定义的。
void cv::resize(InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR)
这些InputArray
和OutputArray
类实现了包含Mat
引用的构造函数,因此更改可以保留到dst
_InputArray(const Mat& m);
_OutputArray(Mat& m);
答案 1 :(得分:0)
您将mat
传递给按值运行,请通过引用再次尝试或返回resizeMat
。