文章目录
一、指定内值创建Mat
1.构造函数
(1)原型1:尺寸行列
Mat(
int rows,
int cols,
int type,
const Scalar &s
)
参数
- rows:行/高
- cols:列/宽
- type:类型。
即上面的CV_8UC3 - s:Scalar数据结构,用于初始化每个像素通道的可选值
如:
//火红色(RGB)是255,46,51,那么Scalar(BGR)就是51,46,255
Mat A(400,800,CV_8UC3,Scalar(51,46,255));
imshow("Effect",A);
(2)原型2:尺寸Size
Mat(
Size sz,
int type,
const Scalar &s
)
如:
Mat A(Size(400,800),CV_8UC3,Scalar(51,46,255));
2.指定每个初始值
原型:
Mat (Mat_<type>(rows,cols)<<.....);
注意:要用括号括起来。
参数
返回一个Mat类对象
- type:像素通道值的数据类型
uint8_t
:8Uint
:32Sfloag
:32F
- rows:矩阵的行
- cols:矩阵的列
如:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
Mat A=(Mat_<int>(3,3)<<1,2,3,4,5,6,7,8,9);
cout<<A<<endl;
return 0;
}
3.Matlab式初始方法
- ①
Mat Mat::zeros(int rows, int cols, int type)
:0矩阵 - ②
Mat Mat::eye(int rows, int cols, int type)
:单位矩阵 - ③
Mat Mat::ones(int rows, int cols, int type)
:1矩阵
或
- ①
Mat Mat::zeros(Size size, int type)
:0矩阵 - ②
Mat Mat::eye(Size size, int type)
:单位矩阵 - ③
Mat Mat::ones(Size size, int type)
:1矩阵
如:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
Mat z1=Mat::zeros(3,3,CV_8UC1); //零矩阵
cout<<z1<<endl;
Mat e1=Mat::eye(3,3,CV_8UC1); //单位矩阵
cout<<e1<<endl;
Mat o1=Mat::ones(3,3,CV_8UC1); //全1矩阵
cout<<o1<<endl;
//以BGR为一个矩阵元素,矩阵初始化对该元素的第一通道蓝色起操作。
//比如单位矩阵,就是对角元素上的B通道为1,而不是BGR都为1
Mat z3=Mat::zeros(3,3,CV_8UC3);
cout<<z3<<endl;
Mat e3=Mat::eye(3,3,CV_8UC3);
cout<<e3<<endl;
Mat o3=Mat::ones(3,3,CV_8UC3);
cout<<o3<<endl;
return 0;
}
二、只指定尺寸创建Mat
1.构造函数
(1)原型1:尺寸行列
Mat(
int rows,
int cols,
int type
)
参数
- rows:行/高
- cols:列/宽
- type:类型。
即上面的CV_8UC3
如:
Mat A = Mat(3,3,CV_8UC1);
// A的值可能是全零,也可能是随机的
/**
[120, 91, 46;
157, 248, 127;
0, 0, 112]
[ 0, 0, 0;
0, 0, 0;
0, 0, 8]
*/
(2)原型2:尺寸Size
Mat(
Size sz,
int type
)
如:
Mat A = Mat(Size(3,3),CV_8UC1);
2.Mat_<type>
原型:
Mat (Mat_<type>(rows,cols));
注意:要用括号括起来。
参数
返回一个Mat类对象
- type:像素通道值的数据类型
- rows:矩阵的行
- cols:矩阵的列
如:
Mat A=(Mat_<uint8_t>(3,3));
cout<<A<<endl;
3.Mat Mat::create()
(1)原型1:尺寸行列
void Mat::create(int rows, int cols, int type)
参数1
- rows:要转化成的行/高
- cols:要转化成的列/宽
- type:要转化成的类型。
(2)原型2:尺寸Size
void Mat::create(Size size, int type)
参数2
- size:尺寸
- type:要转化成的类型。
注意:转化后的通道数值是无法确定的,所以此方法只能用来开辟内存,不能用来指定初值。一般用来创建相同尺寸、type的图片,之后要有清零操作。
(3)创建相同尺寸、type的图片
Mat srcImage=imread("3.jpg");
Mat dstImage;
dstImage.create(srcImage.size(),srcImage.type());
//清零,防止出现乱点
dstImage=Scalar::all(0);