最近想利用opencv自帶函數處理數據,但數據類型爲vector型,於是利用Mat的構造函數直接將vector數據轉存到新Mat中如
#include <iostream>
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
vector<uchar> vecSrc; //源
for (int i = 0; i<100; i++)
vecSrc.push_back(255);
Mat matSre(vecSrc); // 100*1 矩陣
namedWindow("matSre", WINDOW_AUTOSIZE);
imshow("matSre", matSre);
waitKey(0);
destroyAllWindows();
return 0;
}
問題
這段代碼執行起來看起來沒什麼問題,但是要注意,Mat的構造函數只是簡單的淺拷貝到matSrc中,它並不新開闢空間存儲數據,而是與vecSrc共用內存,而當vecSrc被手動清除或vecSrc爲某局部變量時,vecSrc的所佔內存被清除,則matSrc中存儲的數據也一併清除,這是在對matSrc進行數據操作或代碼自動釋放matSrc內存時會出現錯誤。
解決方法
儘量在對Mat賦值時採用clone的方法,除非你非常確定不會因爲原Mat的修改影響新賦值的Mat的數據
#include <iostream>
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
vector<uchar> vecSrc; //源
for (int i = 0; i<100; i++)
vecSrc.push_back(255);
//---採用clone的方法進行深拷貝---
Mat matSre = Mat(vecSrc).clone(); // 100*1 矩陣
namedWindow("matSre", WINDOW_AUTOSIZE);
imshow("matSre", matSre);
waitKey(0);
destroyAllWindows();
return 0;
}