以下内容主要来自 OpenCV 中的 mat.hpp 这个头文件
关于 Mat
Mat 是 OpenCV 中用来存储图像数据的基础数据结构,原话是
It can be used to store real or complex-valued vectors and matrices, grayscale or color images, voxel volumes, vector fields, point clouds, tensors, histograms (though, very high-dimensional histograms may be better stored in a SparseMat ).
可以用来存储实数或者复数向量或者矩阵,灰度图或者彩色图,体素,向量场,点云,张量图,直方图。
创建 Mat 的方式有很多种,最常用的是指定 mat 的行数、列数以及类型,比如
// 创建一个有 2 个通道 7x7 的矩阵,两通道分别赋值为 1 和 3,数据类型为 Float.
Mat M(7, 7, CV_32FC2, Scalar(1, 3));
// 类似第一个,创建一个具有 15 通道,100x60 的矩阵
M.create(100, 60, CV_8UC(15));
// 创建一个 100x100x100 的 U8 数组
int sz[] = {100, 100, 100};
Mat bigCube(3, sz, CV_8U, Scalar::all(0));
- Use a copy constructor or assignment operator where there can be an array or expression on the
right side (see below). As noted in the introduction, the array assignment is an O(1) operation
because it only copies the header and increases the reference counter. The Mat::clone() method can
be used to get a full (deep) copy of the array when you need it.
上面说的是可以使用数组或者表达式来进行拷贝构造或者赋值,其中赋值操作复杂度为 O(1),因为只需要复制首地址然后增加引用计数即可,如果想要进行深拷贝可以使用 Mat::clone() 方法;这一特性可以帮助我们来操作 Mat 中存储的元素,比如:
// add the 5-th row, multiplied by 3 to the 3rd row
M.row(3) = M.row(3) + M.row(5)*3;
// now copy the 7-th column to the 1-st column
// M.col(1) = M.col(7); // this will not work
Mat M1 = M.col(1);
M.col(7).copyTo(M1);
// create a new 320x240 image
Mat img(Size(320,240),CV_8UC3);
// select a ROI
Mat roi(img, Rect(10,10,100,100));
// fill the ROI with (0,255,0) (which is green in RGB space);
// the original 320x240 image will be modified
roi = Scalar(0,255,0);
下面介绍一些 Opencv 中 Mat 的初始化方法:
Mat(int rows, int cols, int type);
// @param size 2D array size: Size(cols, rows)
Mat(Size size, int type);
/** @param s An optional value to initialize each matrix element with. To set all the matrix elements to the particular value after the construction, use the assignment operator
Mat::operator=(const Scalar& value) .
*/
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);
// 使用另一个 Mat 数据来初始化 Mat
Mat(const Mat& m);
// 将 Mat 的头指针指向 data,不进行内存分配操作,这样就可以借助 Mat 数据结构来处理 data 这个指针指向的内存数据,处理完之后要自己手动释放 data 指向的内存
Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);
Mat(Size size, int type, void* data, size_t step=AUTO_STEP);
Mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0);
// 使用另一个 Mat 中的 ROI 数据来初始化 Mat
Mat(const Mat& m, const Rect& roi);
标签:const,Mat,int,OpenCV,Scalar,type,浅析,size
From: https://www.cnblogs.com/hhuxty/p/17971589