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

时间:2015-01-26 09:38:00

标签: c++ opencv

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

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;

我得到了一些垃圾:

call the function from main

我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

尝试

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()

编辑:也许有一个标志要从输入数组/向量中复制数据,所以你可以在Mat构造函数中使用它而不是稍后调用.clone,但不确定!

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

答案 1 :(得分:0)

正如所解释的那样here operator=制作矩阵的浅表副本。虽然有人说,存在某种引用计数,很可能这种方法实现得不够好。你应该试试:

Mat Y(getHigherThanZero(X));