从函数调用返回 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;
也有效 ;)
在下面的函数中,输入参数是一个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;
也有效 ;)