Mat对象
学习内容
- Mat对象与IplImage对象
- Mat对象使用
- Mat定义数组
Mat对象与IplImage对象
Mat对象OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分了两个部分,头部与数据部分。
IplImage是从2001年OpenCV发布之后就一直存在,是C语言风格的数据结构,需要开发者自己分配与管理内存,对大的程序使用它容易导致内存泄漏问题。
总结一下:说白了就是IplImage这个对象他对于操作的容错性比较差,但是Mat类型就没有这个问题,属于OpenCV新时代的产物。
Mat对象构造函数常见的方法:
Mat() Mat(int rows, int cols, int type) Mat(Size size, int types)
…等等还有几个,但是我们常用的就是上面的。
常用的方法:
void copyTo(Mat src) // 完全拷贝 void convertTo(Mat dst, int type) // 数据类型的切换 Mat clone() // 深拷贝 int channels() // 获取通道数 int depth() // 图像深度 bool empty() // 是否为空 uchar* ptr(i = 0) // 图像的按行的指针,i等于行数,0位第一行
Mat对象的使用
部分复制:一般情况下只会复制Mat对象的头和指针部分,不会复制数据部分
Mat A= imread(imgFilePath);
Mat B(A) // 只复制
完全复制:如果想把Mat对象的头部和数据部分一起复制,可以通过如下两个API实现
Mat F = A.clone();
或者也可以下面这个实现
Mat G; A.copyTo(G);
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,第四个参数是向量表示初始化每个像素值是多少,向量长度对应通道数目一致
创建多维数组cv::Mat::create
int sz[3] = {2,2,2}; Mat L(3,sz, CV_8UC1, Scalar::all(0));
cv::Mat::create实现
Mat M; M.create(4, 3, CV_8UC2); M = Scalar(127,127); cout << "M = " << endl << " " << M << endl << endl; uchar* firstRow = M.ptr<uchar>(0); printf("%d", *firstRow);
定义小数组
Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); cout << "C = " << endl << " " << C << endl << endl;