C++ OpenCv C++;,将传入的Mat分配给函数内的Mat失败
我有一个函数resizeToShortSide,它接受一个垫子并将其短边的大小调整为指定的值。为了调整大小,我设置了一个目标mat,resizedMat,执行resize,然后将resizedMat分配给输入mat,mat。这是成功的 但是,当函数结束时,传递给函数的Mat再次恢复为其原始大小,就好像没有发生resizedMat的赋值一样!OpenCv Mat始终是通过引用传递的,所以我不确定为什么它会像传递Mat的副本一样。这是有问题的函数C++ OpenCv C++;,将传入的Mat分配给函数内的Mat失败,c++,opencv,image-processing,C++,Opencv,Image Processing,我有一个函数resizeToShortSide,它接受一个垫子并将其短边的大小调整为指定的值。为了调整大小,我设置了一个目标mat,resizedMat,执行resize,然后将resizedMat分配给输入mat,mat。这是成功的 但是,当函数结束时,传递给函数的Mat再次恢复为其原始大小,就好像没有发生resizedMat的赋值一样!OpenCv Mat始终是通过引用传递的,所以我不确定为什么它会像传递Mat的副本一样。这是有问题的函数 void resizeToShortSide(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() << " ";
}
void resizeToShortSide(Mat-Mat、int-shortSide、int-resamplingMethod)
{
//确定哪一侧是短边
布尔短裙;
if(mat.rows类本身包含一些“标题信息”以及指向UMatData
对象的指针。UMatData
处理引用计数。不幸的是,MatSize
定义在Mat
对象中。由于函数resizeToShortSide
按值获取Mat
,因此在y返回时无法更新大小我们的函数。您仍然需要通过引用传递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);
您将mat
传递给值函数,然后通过引用重试,或者返回resizeMat
。我相信mat
的大小是在mat
类本身中定义的,而不是在UMatData
结构中定义的,该结构是内存管理和引用计数的。因此,除非通过参考传递。