在下面的函数中,输入参数是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;
我得到了一些垃圾:
我在这里做错了什么?
答案 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()
编辑2:cv::Mat Y = cv::Mat(XX).reshape(1).clone();
后跟return Y;
也有效;)
答案 1 :(得分:0)
正如所解释的那样here operator=
制作矩阵的浅表副本。虽然有人说,存在某种引用计数,很可能这种方法实现得不够好。你应该试试:
Mat Y(getHigherThanZero(X));