【OpenCV】std::vector轉cv::Mat(注意:出現崩潰 定位Mat::Release函數)

最近想利用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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章