今天調程序發現一個問題,代碼如下
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的淺拷貝函數,數據共享,所以會出現上面的問題。