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