Mat对象
- 一张图,在计算机中是二维数组的形式存放的,把这个数组存放在Mat对象里面,是一个数据结构
- Mat对象与IplImage对象
- Mat对象是OpenCV2.0之后引进的数据结构,自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。
- 分为两个部分,头部与数据部分
- IplImage是从2001年OpenCV发布之后就一直存在的,是C语言风格的数据结构,需要开发人员自己分配与管理内存,对大的程序使用它容易导致内存泄漏的问题
- 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=0表示第0行
- void copyTo(Mat mat)
构造:
Mat dst; dst = Mat(src.size(), src.type()); //定义大小,类型 dst = Scalar(127, 0, 255); namedWindow("output", CV_WINDOW_AUTOSIZE); imshow("output", dst);
生成一张什么都没有的图像,颜色是RGB(127, 0, 255),大小、类型与原图像相同
完全拷贝:
1,克隆clone()
Mat dst = src.clone();
2,copyTo()
Mat dst;
//需要传一个参数
src.copyTo(dst);通道数channels()
cvtColor(src, dst, CV_BGR2GRAY); //转换为灰度图
printf("input image channels: %d\n", src.channels()); //看看有多少个通道
printf("output image channels: %d\n", dst.channels());
取地址uchar* ptr(i=0)
//取第一个相素值的位置
const uchar* firstRow = dst.ptr<uchar>(0);
printf("first pixel value: %d", *firstRow);得到全部的行/列
int cols = dst.cols;
int rows = dst.rows;
Mat对象的使用
- 部分复制:
- 一般情况下只会复制对象的头和指针部分,不会复制数据部分
- Mat A = imread(imgFilePath);
- Mat b(A)//只部分复制
- 完全复制:
- 如果想把Mat对象的头部和数据部分一起复制,可以通过如下两个API实现
- Mat F = A.clone();
- Mat G
A.copyTo(G)
- 如果想把Mat对象的头部和数据部分一起复制,可以通过如下两个API实现
- Mat对象使用的四个要点
- 输出图像的内存是自动分配的
- 使用OpenCV的C++接口,不需要考虑内存分配问题
- 赋值操作和拷贝操作只会复制头部分
- 使用clone与copyTo两个函数才能实现完全复制
Mat对象的创建
- cv::Mat::Mat构造函数
- Mat M(2,2,CV_8UC3,Scalar(0,0,255))
- 前两个参数分别表示行(row)和列(column)
- 第三个CV_8UC3中的8表示每个通道占8位,U表示无符号,C表示Char类型,3表示通道数目为3
- 第四个参数是向量表示初始化每个像素值是多少,向量长度对应通道数目一致
- Mat M(2,2,CV_8UC3,Scalar(0,0,255))
- 创建多维数组
- int sz[3] = {2,2,2};
- Mat L(3,sz,CV_8UC1,Scar::all(0));
- cv::Mat::creat实现
- Mat M;
M.creat(4,3,CV_8UC2);
M = Scalar(127,127);
- Mat M;
- 定义小数组
- Mat kernel = (Mat_(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
- filter2D(src, dst, -1, kernel);
- 小技巧
- zeros,全0
- eye,对角线变成1,其它地方变成0