opencv Mat存儲在std::vector 時要注意的問題

今天調程序發現一個問題,代碼如下

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,00)和(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的淺拷貝函數,數據共享,所以會出現上面的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章