opencv Mat存储在std::vector 时要注意的问题
2017-02-11 15:06
260 查看
今天调程序发现一个问题,代码如下
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的浅拷贝函数,数据共享,所以会出现上面的问题。
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的浅拷贝函数,数据共享,所以会出现上面的问题。
相关文章推荐
- Mat函数的定义与vector存储到Mat中的问题
- 使用std的vector,map,list, set等注意问题
- opencv 中Mat与vector使用时注意事项
- opencv mat寻址操作注意点
- 以void * 存储的数据在复制时需注意的问题
- 使用SQL存储过程要特别注意的问题-注意顺序读取
- MFC中和libpq调用PostgreSQL存储过程需要注意的问题
- .net调用数据库存储过程应当注意的问题
- OpenCV中IplImage->imageData赋值需要注意的问题
- 使用std::sort需要注意的问题
- vector构建和销毁需要注意的两个问题
- vector 容器使用时应该注意的内存分配问题
- 存储过程中操作了链接服务器时要注意的问题
- vector 容器使用时应该注意的内存分配问题
- std::sort需要注意的问题(coredump)
- 存储过程里使用select要注意的一个问题!
- Vector中作为全局变量时注意的问题(转)
- 使用存储过程中应该注意的问题(原创)
- OpenCV开始用时的要注意的一个问题
- std::vector的一些使用注意事项