最近想利用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;
}