学习内容:
1、Mat的定义 2、Mat的基本操作(一)
学习产出:
1、 Mat的定义
Mat本身是一个通用的矩阵类。因此,我们可以创建和操纵多维矩阵等方式来创建Mat对象。
例如:
Mat M(2,2,CV_8UC3,Scalar(0,0,255));
这句代码创建了一个名为M的Mat对象,这个M为一个多维矩阵,其最外一层为大小为2*2(rows,行数;cols ,列数),即宽为2,长为2的图像。
(1)其中,CV_8UC3用于存储元素的数据类型和每个矩阵点的通道数,即规定了外层矩阵的大小,这里初学的时候不好理解,我们可以类比C语言中的多维矩阵,实际上这里相当于用特定的规范语言来描述一个多维矩阵。
引用自:
OpenCV CV_8UC3含义
CV_<bit_depth>(S|U|F)C<number_of_channels>
(1) bit_depth—比特数—代表8bite\16bite\32bite\64bite
eg:8表示你所创建的储存图片的Mat对象中,每个像素点在内存空间所占的空间大小8bite。
(2) S|U|F
S: signed int,即有符号整型;
U: unsigned int,即无符号整型;
F: float,单精度浮点型。
(3) C<number_of_channels>:所存储的图片的通道数。
eg 1—grayImg灰度图像—是—单通道图像
2—RGB彩色图像—是—3通道图像
3—带Alpha通道的RGB彩色图像—是—4通道图像
(2)这里用Scalar(0,0,255)赋给具有相同通道数的矩阵元素,即对内层进行赋值,Scalar是一个由长度为4的数组作为元素构成的结构体,Scalar最多可以存储四个值,没有提供的值默认是0。
这里引用[opencv Scalar()的使用心得]中的解释(https://blog.csdn.net/zqx951102/article/details/82797484)
在Opencv中,cvScalar是CV_RGB的宏,cvScalar的储存顺序是B-G-R,而CV_RGB的储存顺序是R-G-B,两者正好相反,所以你的cvScalar(255,0,0),实际意思是B=255,当然是蓝色的
因此Scalar(0,0,255)赋值颜色为红色。
2、Mat的基本操作(一)
(1)我们可以自己初始化一个小型矩阵,如下
Mat C =(Mat_ <double>(3,3)<< 0,-1,0,-1,5,-1,0,-1,0);
cout << “C =” << endl << “”“ << C << endl << endl;
输出
(2)这里我们可以使用Mat::clone与Mat::copyTo对Mat进行复制,copyTo不会为目标矩阵重新分配内存,而clone总是会为目标矩阵重新分配内存。具体参考
Mat::clone与Mat::copyTo的区别
当我要提取图像某一通道信息时,可以使用下列语句
Mat RowClone = C.row(1).clone();
cout << “RowClone =” << endl << “” << RowClone << endl << endl;
输出