OpenCv C ++,在函数内为Mat分配传入的Mat失败

时间:2017-10-24 00:15:45

标签: c++ opencv image-processing

我有一个函数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() << " ";
}

2 个答案:

答案 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函数是使用InputArrayOutputArray参数定义的。

void cv::resize(InputArray  src, OutputArray dst, Size  dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR) 

这些InputArrayOutputArray类实现了包含Mat引用的构造函数,因此更改可以保留到dst

_InputArray(const Mat& m);
_OutputArray(Mat& m);

答案 1 :(得分:0)

您将mat传递给按值运行,请通过引用再次尝试或返回resizeMat