从函数调用返回 Mat 时出现奇怪的结果

strange results while returning a Mat from a function call

在下面的函数中,输入参数是一个2列的Mat矩阵, 我遍历它并 return 一个仅包含非零元素的新矩阵。

Mat LaneDetector::getHigherThanZero(const Mat& X)
{

vector<Vec2f> XX;

for(int i = 0; i < X.rows; ++i)
{
    if(X.at<float>(i,1) > 0)
        XX.push_back(Vec2f(X.at<float>(i,0), X.at<float>(i,1)));
}
Mat Y = Mat(XX).reshape(1);
return Y;

}

当我运行这个主要是,一切正常。当我从主调用它时如下:

Mat Y = getHigherThanZero(X);
cout << Y << endl;

我得到了一些垃圾:

我哪里做错了?

如前所述,here operator= 对矩阵进行浅表复制。尽管声明存在某种引用计数,但很可能实现得不够好。你应该试试:

Mat Y(getHigherThanZero(X));

尝试

cv::Mat LaneDetector::getHigherThanZero(const cv::Mat& X)
{

    std::vector<cv::Vec2f> XX;

    for(int i = 0; i < X.rows; ++i)
    {
        if(X.at<float>(i,1) > 0)
            XX.push_back(cv::Vec2f(X.at<float>(i,0), X.at<float>(i,1)));
    }

    cv::Mat Y = cv::Mat(XX).reshape(1);

    return Y.clone();

}

你的 XX 超出了范围并且 cv::Mat(XX) 没有复制数据,所以你必须自己复制它,这是由 .clone()

完成的

编辑:也许有一个标志可以从输入 array/vector 复制数据,因此您可以在 Mat 构造函数中使用它而不是稍后调用 .clone,但不确定!

编辑 2:cv::Mat Y = cv::Mat(XX).reshape(1).clone(); 后跟 return Y; 也有效 ;)