【Opencv&Cpp】03 细说Mat:图像对象的创建与赋值

MAT

创建图像对象的四种方法

Mat 对象的创建有多种方式:克隆、复制、赋值、构造函数。

 Mat src = imread("d:/test.jpg");   //读取源地址

构造函数 Mat img_constructe(src);
赋值 Mat img_assign = src;
复制

Mat img_copy;        src.copyTo(img_copy);

克隆 Mat img_clone = src.clone();

速度从快到慢:构造函数、赋值、复制、克隆。(运行速度代码)

double t1 = (double)getTickCount(); 

//中间放要测试时间的代码端

t1 = (double)getTickCount() - t1;


//输出运行时间
printf("clone = %lf ms\n", t1*1000. / getTickFrequency());

创建空白图像

创建8*8的矩阵图像  且每个数据单通道

Mat m3 = Mat::zeros(Size(8, 8), CV_8UC1);//创建空图像、8*8矩阵、单通道

std::cout << m3 << std::endl;

【Opencv&Cpp】03 细说Mat:图像对象的创建与赋值_第1张图片

 

创建8*8的矩阵图像  且每个数据3通道

Mat m3 = Mat::zeros(Size(8, 8), CV_8UC3);//创建空图像、8*8矩阵、单通道

std::cout << m3 << std::endl;

【Opencv&Cpp】03 细说Mat:图像对象的创建与赋值_第2张图片

 

 宽度、高度、通道数,且为数据赋值

	Mat m3 = Mat::zeros(Size(8, 8), CV_8UC3);//创建空图像、8*8矩阵、3通道

	m3 = Scalar(0, 0, 255);

	std::cout << "width: " << m3.cols << " height: " << m3.rows << " channels: " << m3.channels() << std::endl;

【Opencv&Cpp】03 细说Mat:图像对象的创建与赋值_第3张图片

如果输出其图片:BGR(0,0,255)

imshow("图片",m3)

显而易见,创建了一个红色的8*8的图片

拷贝与赋值的区别!

拷贝:Mat m4; m3.copyTo(m4);

赋值:Mat m4=m3;

区别:拷贝不会改变原对象,而赋值则m4一变m3也会随之改变!(跟一般int变量不同)

 

Mat类的函数

data:Mat对象中的一个指针,指向内存中存放矩阵数据的一块内存 (uchar* data)

dims:Mat所代表的矩阵的维度,如 3 * 4 的矩阵为 2 维, 3 * 4 * 5 的为3维

channels:通道,矩阵中的每一个矩阵元素拥有的值的个数,比如说 3 * 4 矩阵中一共 12 个元素,如果每个元素有三个值,那么就说这个矩阵是 3 通道的,即 channels = 3。常见的是一张彩色图片有红、绿、蓝三个通道。

depth:深度,即每一个像素的位数(bits),在opencv的Mat.depth()中得到的是一个 0 – 6 的数字,分别代表不同的位数:enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 }; 可见 0和1都代表8位, 2和3都代表16位,4和5代表32位,6代表64位;

step:是一个数组,定义了矩阵的布局,具体见下面图片分析,另外注意 step1 (step / elemSize1),M.step[m-1] 总是等于 elemSize,M.step1(m-1)总是等于 channels;

elemSize : 矩阵中每一个元素的数据大小,如果Mat中的数据的数据类型是 CV_8U 那么 elemSize = 1,CV_8UC3 那么 elemSize = 3,CV_16UC2 那么 elemSize = 4;记住另外有个 elemSize1 表示的是矩阵中数据类型的大小,即 elemSize / channels 的大小

你可能感兴趣的:(opencv学习,opencv,python,计算机视觉)