OpenCV3之Mat类的创建


一、指定内值创建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:8U
    • int:32S
    • floag: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);
发布了411 篇原创文章 · 获赞 144 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/sandalphon4869/article/details/103837087