Opencv中的Mat对象——图像数据结构

前言

Mat对象作为一个加载或都进去的内存对象,它到底是什么?

一、对象是什么?

对象就是可以拥有属性和方法的一个集合

二、Mat对象怎么样看图像?

在正常人眼中,他是一张图片;
在我的眼中,他是我的偶像;
在计算机中,他会被解析为一个二维数组;

在这里插入图片描述

二、Mat对象的来源?

我们说Mat库是怎么样出现的呢?在opencv1.几的版本中,处理图像是采用IplImage库(采用C语言的风格)来实现的,但很快,内存泄漏的问题就出现了;
在此基础上,opencv2.几的版本中引入了面向对象编程,Mat对象就是采用C++风格的数据结构。

三、Mat对象的构造函数:

1)简单介绍构造函数与析构函数:

      3.1.1、构造函数的定义:构造函数是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。类可以有多个构造函数 ,可根据其参数个数不同或参数类型不同来区分它们即。

      3.1.2、析构函数的定义:析构函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。

2)Mat对象的构造函数:
      3.2.1、Mat对象的无参数构造函数:

Mat::Mat();
//生成一个矩阵并由OpenCV提供的函数(一般是Mat::create() 和 cv::imread() )来分配储存空间。
//Mat类可以分为两个部分:矩阵头和指向像素数据的矩阵指针

      我们转到该构造方法的定义:可以看到该段注释
在这里插入图片描述      中文下的意思如下:
      @param rows二维数组中的行数。
      @param cols表示二维数组中的列数。
      @param type数组类型。使用CV_8UC1,…,CV_64FC4创建1-4个通道矩阵,
      或CV_8UC(n),…,CV_64FC(n)创建多通道(最多CV_CN_MAX通道)矩阵。

      3.2.2、Mat对象使用行(rows)、列(cols)、类型(type)的构造函数:

Mat::Mat(int rows, int cols, int type);

      3.2.3、Mat对象使用大小(size)、类型(type)的构造函数:

Mat::Mat(Size size, int type);

      3.2.4、Mat对象使用行(rows)、列(cols)、类型(type)、Scalar标量的构造函数:

Mat::Mat(int rows, int cols, int type, const Scalar& s);

      3.2.5、Mat对象使用大小(size)、类型(type)、Scalar标量的构造函数:

Mat::Mat(Size size, int type, const Scalar& s);

      3.2.6、Mat对象使用size指定n维数组形状的整数数组、类型(type)的构造函数:

Mat::Mat(int ndims, const int* sizes, int type);
//ndims数组维数

      3.2.7、Mat对象使用size指定的动态整数数组、类型(type)的构造函数:

Mat::Mat(const std::vector<int>& sizes, int type);
//vector,传入动态整数数组,在使用前,需导入#include <vector>

      3.2.8、Mat对象使用size指定n维数组形状的整数数组、类型(type)、Scalar向量的构造函数:

Mat::Mat(int ndims, const int* sizes, int type, const Scalar& s);

      3.2.9、Mat对象将m赋值给新创建的对象,不对图像数据进行复制,共用图像数据,属于浅拷贝的构造函数:

Mat::Mat(const Mat& m);

      3.2.10、Mat对象使用行(rows)、列(cols)、类型(type),数据指针以及矩阵行占用的字节数的构造函数:

Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);

/*@param size 2D array size:大小(列、行)。在Size()构造函数中,行数和列数按相反顺序排列。
@param type数组类型。使用CV_8UC1,…,CV_64FC4创建1-4个通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(最多CV_CN_MAX通道)矩阵。
@param data指向用户数据的指针。接受数据和步长参数的矩阵构造函数不分配矩阵数据。相反,它们只是初始化指向指定数据,这意味着没有数据被复制。此操作非常有效,可用于使用OpenCV函数处理外部数据。外部数据不会自动释放,因此你应该照顾好它。
@param step每个矩阵行占用的字节数。该值应包括以下位置的填充字节:每行的末尾(如果有)。如果缺少参数(设置为AUTO\u STEP),则假定没有填充实际步长计算为cols*elemSize()。请参阅Mat::elemSize。
此构造函数不创建图像数据所需内存,而是直接使用data指针,图像的行步长由 step指定。
*/

      3.2.11、Mat对象使用大小(size)、类型(type),数据指针以及矩阵行占用的字节数的构造函数:

Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP);

      3.2.12、Mat对象将新创建m的一部分,由roi指定范围的构造函数:

Mat::Mat(const Mat& m, const Rect& roi);

3)这些是构成矩阵的各种构造函数。如自动定位中所述,通常默认构造函数就足够了,适当的矩阵将由OpenCV函数分配。所构造的矩阵可以进一步分配给另一个矩阵或矩阵表达式,或者可以是用Mat::create分配。在前一种情况下,旧内容被取消引用。

4)最常用的Mat构造方法如下:

Mat::Mat();
Mat::Mat(int rows,int cols,int type);
Mat::Mat(Size size,int type ) ;
Mat::Mat(int ndims,const int *  sizes,int type,const Scalar& s) ;
Mat::Mat(const Mat & m);
//如有需要可自行学习其他构造函数

四、Mat对象的构造函数的举例:

代码块:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main() {
    
    
	
	Mat src = imread("C:\\Users\\ASUS\\Desktop\\3.png");
	namedWindow("input_Image_Windows", WINDOW_AUTOSIZE);
	imshow("input_Image_Windows", src);

	//Mat dst = Mat();//无参数构造函数使用
	Mat dst = src;
	namedWindow("output_Image_Windows", WINDOW_AUTOSIZE);
	imshow("output_Image_Windows", dst);
	
	waitKey(0);
	return 0;
}

运行结果:
在这里插入图片描述

五、Mat对象的成员函数:

1、clone函数,将矩阵复制到另一个矩阵;
2、copyTo函数,拷贝,与上一个类似;
3、Create函数,创建一个新的矩阵;
4、convertTo函数,提供转换矩阵的函数;
5、depth函数,返回图像深度;
6、channels函数,返回图像通道数;
7、type函数,返回矩阵类型;
8、zeros函数,返回0矩阵;
其余函数可自行查找,使用方法不一一介绍了。

总结

Mat对象作为图像处理的数据结构,内容很丰富,需要学习的内容也很多,等使用到了哪个,再花时间学习,不需特意花时间去学,但基本的是要了解并使用的。

如有错误,敬请指正!

猜你喜欢

转载自blog.csdn.net/ivan_9/article/details/113087688