OpenCV图像处理04-Mat对象

04-Mat对象

Mat对象与IplImage对象

//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对象的使用

  • 部分复制:一般情况下只会复制Mat对象的头和指针部分,不会复制数据部分

    Mat A = imread("D:\\...");
    Mat B(A); //部分复制
    
  • 完全复制:如果想把Mat对象的头部和数据部分全都复制,可以通过以下两个API实现

    Mat F = A.clone();
    //或
    Mat G;
    A.copyTo(G);
    

四个要点:

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

Mat对象的创建

//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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值