您的位置:首页 > 运维架构

opencv Mat存储在std::vector 时要注意的问题

2017-02-11 15:06 211 查看
今天调程序发现一个问题,代码如下

std::vector<cv::Mat>PointCloud;

cv::Mat Pw =cv::Mat::zeros(3,1,CV_32FC1);//世界坐标

Pw.at<float>(0,0)= 0.0;

Pw.at<float>(1,0)=
0.0;

Pw.at<float>(2,0)=
0.0;

PointCloud.push_back(Pw);//将世界原点添加到点云中

Pw.at<float>(0,0)=
10.0;//更改坐标

Pw.at<float>(1,0)=
10.0;

Pw.at<float>(2,0)=
10.0;

PointCloud.push_back(Pw);//将世界原点添加到点云中

我想的是PointCloud中存放的应该是两组坐标点:(0,0,0)和(10,10,10)

但结果却是:(10,10,10)和(10,10,10)

原因是:pushback会调用拷贝构造函数来拷贝数据,这就涉及到Mat的深拷贝和浅拷贝问题了:

OpenCVMat之间赋值


浅拷贝

//注意:浅拷贝 -  不复制数据只创建矩阵头,数据共享(更改a,b,c的任意一个都会对另外2个产生同样的作用)

Mat a;

Mat b = a; //a "copy" to b

Mat c(a); //a "copy" to c

深拷贝

//注意:深拷贝

Mat a;

Mat b = a.clone(); //a copy to b

Mat c;

a.copyTo(c); //a copy to c 

这里pushback调用的是Mat的浅拷贝函数,数据共享,所以会出现上面的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OpenCV Mat vector.p