作者:Min2502857657_377 | 来源:互联网 | 2023-09-16 13:31
个人资料,仅供学习使用
修改时间——2022年1月20日 02:48:02
学习课程:OpenCV4 C++ 快速入门视频30讲
视频老师:贾志刚
03 图像对象的创建与赋值
opencv知识点:
- mat - 简述
- 3种复制 - 克隆/拷贝 + 赋值
- 创建空白图像 - Mat::zeros + Mat::ones + “=” + Scalar
本课解决的问题:
- Mat是什么?
- 克隆/拷贝与赋值的区别?
- 如何创建空白图像?
- 如何对矩阵赋值?
1.Mat简述
什么是Mat呢,就是matrix(矩阵)的缩写
我们看到的图像,就是以数字矩阵的形式存储在计算机中
在opencv中,我们用Mat类存储图像。
在opencv中,Mat类分为两个部分
矩阵头
图像有很多属性。
如:大小,宽高,数据类型,通道数
这些属性,就在矩阵头中
矩阵数据
数据部分,就是所有像素的值的一个集合
这里说一下赋值,与克隆/拷贝的区别
赋值
相当于浅复制,只复制了矩阵头,指向的是同一个数据块。
克隆/拷贝
相当于深复制,还会复制相应的数据块
2.Mat对象
3种常见的复制
Mat m1 = src.clone();
src.copyTo(m2);
Mat m3 = src;
创建空白图像
Mat m4 = Mat::zeros(src.size(),src.type())
Mat m5 = Mat::zeros(Size(512,512),CV_8UC3);
Mat m6 = Mat::ones(Size(512,512),CV_8UC3);
C11创建图像的新方式
Mat kernel = (Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
3.本课的代码
void mat_creation_demo(Mat& image);
void QuickDemo::mat_creation_demo(Mat& image) {Mat m1, m2;m1 = image.clone();image.copyTo(m2);Mat m3 = Mat::zeros(Size(8, 8), CV_8UC3);std::cout<<"cols:" << m3.cols <<"rows:" << m3.rows<<"channels:" << m3.channels()<<std::endl;std::cout << m3 << std::endl;
}
4.矩阵赋值
Mat::zeros
Mat m3 = Mat::zeros(Size(8, 8), CV_8UC1);Mat m3 = Mat::zeros(Size(8, 8), CV_8UC3);
当为CV_8UC1时,此时1个通道,8行8列
当为CV_8UC3时,此时1个通道,8行8*3列
所以矩阵数据的宽度,为图像的列 * 通道数
那么如何获取图像的行数,列数,通道数呢?
m3.cols;
m3.rows;
m3.channels();
Mat::ones
当填充为1的时候,要特别小心
Mat m3 = Mat::ones(Size(8, 8), CV_8UC1);Mat m3 = Mat::ones(Size(8, 8), CV_8UC3);
1通道没问题
3通道,只在每3个的第一个为1
“=” + Scalar
m3=127;
当给m3赋值1个值时,每3个的第一个为127
那怎么全变成127呢?那就用到了Scalar
m3=Scalar(127,127,127);
那我们来显示一下,全127,对应的图像
imshow("创建图像",m3);
本课所用API查阅
1.Mat::zeros
常用的有两种
第一种,3个参数( 行,列,数据类型)
第二种,2个参数(size,数据类型)
2.Mat::ones
常用的有两种
第一种,3个参数( 行,列,数据类型)
第二种,2个参数(size,数据类型)
3.Scalar