0%

【OpenCV4快速入门视频30讲】lesson3:图像对象的创建与赋值

lesson3: 图像对象的创建与赋值

1. 课程目标

掌握OpenCV中Mat对象的创建、拷贝克隆与赋值。

2. 图像对象的创建与赋值

2.1 Mat的基本结构

Mat对象的基本结构

图1. Mat对象的基本结构

Mat对象的基本结构如图1所示,每一个Mat对象由两部分组成:头部,数据部分;头部存储对象的一些基本信息,如图像的基本类型HSV、RGB、GRAY等以及数据的类型,unchar、float、double等。

2.2 Mat对象的克隆与拷贝

代码如下:

1
2
3
Mat m1, m2;
m1 = image.clone();
image.copyTo(m2);

2.3 直接创建Mat对象

可以直接使用zerosones两个函数分别创建不同尺寸大小、数据类型和通道的图像。

代码如下:

1
2
3
4
5
6
7
8
//创建空白对象
Mat m3 = Mat::zeros(Size(8, 8), CV_8UC3); // CV_8: 8位 U: 无符号 3:3通道
std::cout <<"width:"<< m3.cols <<" height:"<< m3.rows <<" channel:"<<m3.channels()<< std::endl;
std::cout << m3 << std::endl;

Mat m4 = Mat::ones(Size(8, 8), CV_8UC3); // CV_8: 8位 U: 无符号 3:3通道
std::cout << "width:" << m4.cols << " height:" << m4.rows << " channel:" << m4.channels() << std::endl;
std::cout << m4 << std::endl;

结果图如下所示:

image-20201217210938992

创建空白Mat对象

2.4 Mat对象的赋值

对一个通道赋值:

1
2
m3 = 127;
std::cout << m3 << std::endl;

结果如下:

image-20201217211307457

对一个通道赋值

对每个通道分别赋值:

1
2
m4 = Scalar(127,0,255);
std::cout << m4 << std::endl;

结果如下:

image-20201217211535746

对各个通道分别赋值

在对Mat对象进行赋值时,应使用clone或者copyTo而不能直接使用赋值=,这样做前一个对象和后一个对象共用一个存储地址,一个改变另一个也会改变。

实验如下:

  • 使用=赋值

    1
    2
    3
    4
    5
    6
    7
    //直接赋值
    m3 = Scalar(255,0,0);
    imshow("m3_0",m3);
    m4 = m3;
    m4 = Scalar(0, 255, 0);
    imshow("m3_1", m3);
    imshow("m4", m4);

    image-20201217212211936

  • 使用clone赋值

1
2
3
4
5
6
m3 = Scalar(255, 0, 0);
imshow("m3_0", m3);
m4 = m3.clone();
m4 = Scalar(0, 255, 0);
imshow("m3_1", m3);
imshow("m4", m4);

image-20201217212534698

  • 使用copyTo赋值
1
2
3
4
5
6
m3 = Scalar(255, 0, 0);
imshow("m3_0", m3);
m3.copyTo(m4);
m4 = Scalar(0, 255, 0);
imshow("m3_1", m3);
imshow("m4", m4);

image-20201217212701169

-------------本文结束感谢您的阅读-------------