Mat对象我们在学习图像处理的过程一直在接触,那么它到底是个什么东西呢?
当OpenCV 1.0发布时候没有Mat对象,是个C语言风格的数据结构IPlImage来表示内存中图像对象,但是OpenCV开发者在做复杂图像处理算法分析与计算时候,创建了很多IplImage这样的数据结构,偶尔最后可能忘记释放内存了,这样算法就有了内存泄漏,导致开发者浪费很多精力去寻找这个错误,这个已经跟图像处理算法没有关系了,但是它却困扰了很多OpenCV开发者。Intel发现自己做的库居然这么渣,广大群众不满意,决定从OpenCV 2.0开始使用一个新的内存对象Mat来表示内存中的图像对象。它是C++风格的数据结构,自动实现内存分配与回收,这样OpenCV开发者就再也不用担心因为使用OpenCV的图像对象数据结构而导致内存泄漏问题了。是面向对象数据结构,分类与头部两个部分。
常用的简单构造Mat类方法
1.直接通过读取图片创造Mat类;
Mat img = imread("路径下图片");
2.利用create函数
Mat img; img.create(src.size(),src.type());
3.利用Scalar函数
Mat img; src.copyTo(img); img=Scalar(0,233,55);
4.利用自身的构造方法Mat img=Mat::zeros(src.size(),src.type());
Mat img=Mat::ones(src.size(),src.type());
Mat img=Mat::eye(src.size(),src.type());
5.利用clone函数
Mat img = src.clone();
Mat类的其他用法
1.创建数组矩阵(如上一节的矩阵掩模)
Mat kernel = (Mat_
2.复制拷贝图片的头与指针
Mat B(A);
不同于clone(),与copyTo()
代码演示
int main() {
//方法1.读取图片
Mat src_image = imread("E:\\360downloads\\hl.png");
//2.判断图片是否读入
if (!src_image.data) {
printf("can't load image ,please checkout your path!");
return 0;
}
imshow("src", src_image);
//方法2
Mat img2;
img2.create(src_image.size(), src_image.type());
imshow("2", img2);
//方法3
Mat img3;
src_image.copyTo(img3);
img3 = Scalar(0, 0, 44);
imshow("3", img3);
//方法4
Mat img4= Mat::zeros(src_image.size(),src_image.type());
imshow("4", img4);
//Mat定义数组矩阵
Mat kernel = (Mat_(4,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0,0,0,0);//3*3的卷积核
imshow("kernel", kernel);
waitKey(0);
return 0;
}