OpenCV图像处理04-Mat对象

2021-03-04 10:45:06 浏览数 (1)

04-Mat对象

Mat对象与IplImage对象

代码语言:javascript复制
//Mat对象是OpenCV2.0之后引进的图像数据结构,可以自动分配内存,不存在内存泄漏的问题,是面向对象的结构。分为头部和数据部分两个部分。
//Mat对象构造函数和常用方法
Mat();
Mat(int rows, int cols, int type);
Mat(Size size, int type);
Mat(int rows, int cols, int type, const Scalar &s);
Mat(Size size, int type, const Scalar &s);
Mat(int ndims, const int *sizes, int type);
Mat(int ndims, const int *sizes, int type, const Scalar &s);
void copyTo(Mat mat);
void convertTo(Mat dst, int type);
Mat clone();
int channels();
int depth();
bool empty();
uchar* ptr(i=0);//获取第i行的指针

IplImage在OpenCV发布之后就一直存在,是C语言风格的数据结构,需要开发者自己分配与管理内存,容易导致内存泄漏问题。OpenCV4.*版本已经淘汰该类型。

Mat对象的使用

四个要点:

  • 图像的内存是自动分配的
  • 使用Opencv的c 接口不需要考虑内存分配问题
  • 赋值操作和拷贝构造函数只会复制头部,而不复制Mat对象的数据部分
  • 可以使用clone()或copyTo(Mat mat)两个方法实现完全复制

Mat对象的创建

代码语言:javascript复制
//1.Mat的构造函数
Mat M(3,3,CV_8UC3,Scalat(0,0,255));
//其中前两个参数代表行和列,CV_8UC3中8表示每个通道占8位,U表示无符号,C表示char类型,3表示通道数为3,第四个参数是向量表示初始化每个像素值是多少,向量长度对应通道数

//2.创建二维数组
int sz[2] = {3,4};
Mat L(2,sz,CV_8UC3,Scalar::all(0)); //L是一个3行4大列(每大列包含规定通道数个(此处为3)小列 )的矩阵 每个元素都是0

//3.create实现
Mat M;
M.create(3,4,CV_8UC3);
M = Scalar(127,127,127);

//4.定义小数组(掩膜)
Mat C = (Mat_<float>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
filter2D(src,dst,-1,C);

//zeros创建全黑图像
Mat G = Mat::zeros(3,3,CV_8UC3);

0 人点赞