MAT
Mat 对象的创建有多种方式:克隆、复制、赋值、构造函数。
Mat src = imread("d:/test.jpg"); //读取源地址
构造函数 | Mat img_constructe(src); |
赋值 | Mat img_assign = src; |
复制 | Mat img_copy; src.copyTo(img_copy); |
克隆 | Mat img_clone = src.clone(); |
速度从快到慢:构造函数、赋值、复制、克隆。(运行速度代码)
double t1 = (double)getTickCount();
//中间放要测试时间的代码端
t1 = (double)getTickCount() - t1;
//输出运行时间
printf("clone = %lf ms\n", t1*1000. / getTickFrequency());
创建8*8的矩阵图像 且每个数据单通道
Mat m3 = Mat::zeros(Size(8, 8), CV_8UC1);//创建空图像、8*8矩阵、单通道
std::cout << m3 << std::endl;
创建8*8的矩阵图像 且每个数据3通道
Mat m3 = Mat::zeros(Size(8, 8), CV_8UC3);//创建空图像、8*8矩阵、单通道
std::cout << m3 << std::endl;
宽度、高度、通道数,且为数据赋值
Mat m3 = Mat::zeros(Size(8, 8), CV_8UC3);//创建空图像、8*8矩阵、3通道
m3 = Scalar(0, 0, 255);
std::cout << "width: " << m3.cols << " height: " << m3.rows << " channels: " << m3.channels() << std::endl;
如果输出其图片:BGR(0,0,255)
imshow("图片",m3)
显而易见,创建了一个红色的8*8的图片
拷贝:Mat m4; m3.copyTo(m4);
赋值:Mat m4=m3;
区别:拷贝不会改变原对象,而赋值则m4一变m3也会随之改变!(跟一般int变量不同)
data:Mat对象中的一个指针,指向内存中存放矩阵数据的一块内存 (uchar* data)
dims:Mat所代表的矩阵的维度,如 3 * 4 的矩阵为 2 维, 3 * 4 * 5 的为3维
channels:通道,矩阵中的每一个矩阵元素拥有的值的个数,比如说 3 * 4 矩阵中一共 12 个元素,如果每个元素有三个值,那么就说这个矩阵是 3 通道的,即 channels = 3。常见的是一张彩色图片有红、绿、蓝三个通道。
depth:深度,即每一个像素的位数(bits),在opencv的Mat.depth()中得到的是一个 0 – 6 的数字,分别代表不同的位数:enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 }; 可见 0和1都代表8位, 2和3都代表16位,4和5代表32位,6代表64位;
step:是一个数组,定义了矩阵的布局,具体见下面图片分析,另外注意 step1 (step / elemSize1),M.step[m-1] 总是等于 elemSize,M.step1(m-1)总是等于 channels;
elemSize : 矩阵中每一个元素的数据大小,如果Mat中的数据的数据类型是 CV_8U 那么 elemSize = 1,CV_8UC3 那么 elemSize = 3,CV_16UC2 那么 elemSize = 4;记住另外有个 elemSize1 表示的是矩阵中数据类型的大小,即 elemSize / channels 的大小