03 图像对象的创建与赋值
opencv知识点:
- mat - 简述
- 3种复制 - 克隆/拷贝 + 赋值
- 创建空白图像 - Mat::zeros + Mat::ones + “=” + Scalar
本课解决的问题:
- Mat是什么?
- 克隆/拷贝与赋值的区别?
- 如何创建空白图像?
- 如何对矩阵赋值?
1.Mat简述
在opencv中,Mat类分为两个部分
- 矩阵头
- 矩阵数据
矩阵头
矩阵数据
这里说一下赋值,与克隆/拷贝的区别
2.Mat对象
3种常见的复制
//1.克隆
Mat m1 = src.clone();
//2.拷贝
src.copyTo(m2);
//3.赋值
Mat m3 = src;
创建空白图像
Mat m4 = Mat::zeros(src.size(),src.type())
/*
矩阵填充0
行列为src行列
数据类型为src的数据类型
*/
Mat m5 = Mat::zeros(Size(512,512),CV_8UC3);
/*
矩阵填充0
行列为512*512
数据类型为CV_8UC3(8UC指8位无符号字符,3指3个通道)
*/
Mat m6 = Mat::ones(Size(512,512),CV_8UC3);
/*
矩阵填充1
其余与上相同
*/
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
常用的有两种
2.Mat::ones
常用的有两种
3.Scalar