C++ OpenCv C++;,将传入的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

我有一个函数resizeToShortSide,它接受一个垫子并将其短边的大小调整为指定的值。为了调整大小,我设置了一个目标mat,resizedMat,执行resize,然后将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() << " ";
}
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
结构中定义的,该结构是内存管理和引用计数的。因此,除非通过参考传递。