OpenCV4学习笔记(1)——图像读取、复制和创建

开篇:作为一名光电信息科学与工程的在读大三学生,我选择了光电视觉方向,又对于图像处理方向感兴趣,所以开始了学习OpenCV的漫漫长路。因为疫情在家呆着,就来整理一下平时学习的笔记注释,借助CSDN这个平台记录下我的学习日常,也有利于以后回顾知识点的方便。学习OpenCV其实有比较长的一段时间了,但是之前都是很零散的学习,而且是以python为主要学习语言,没有形成完整的知识体系,所以在前一段时间开始从头学习C++版本OpenCV的内容,目前还在持续学习中,并在空闲时间整理下自己之前的笔记注释。好的,那就从头开始吧!冲冲冲!!

今天是整理笔记的第一天,要记录的知识点很简单,分别是OpenCV中图像的读取、复制和创建。

1、首先是图像的读取,附上代码:

	Mat image;
	image = imread("");
	resize(image, image, Size(600, 800));

在C++的OpenCV中,图像是以Mat格式保存的,而且由于C++的特性,在使用变量前必须先声明,所以先用Mat类型声明一个图像变量image 。然后使用imread()函数来读取图像文件,最简单的参数设置就是直接将文件路径以 " " 的形式放入其中。不过要注意的是,在windows文件系统中复制文件路径时默认使用的是 反斜杠" \ " ,而这个符号会导致文件读取失败,因为在C++中这是一个转义符号,所以我们把它改成 正斜杠" / ",或者是双反斜杠,我个人喜欢直接再加上一个 " \ ",因为比较方便哈哈哈。
imread()这个函数目前支持的格式有:.bmp, .dib, .jpeg, .jpg, .jpe, .jp2, .png,上述图像格式都是函数文档中标明支持的,emmmmm用得多的应该是.jpg和.png两种格式。

2、其次是图像的复制,代码如下:

Mat m1 = image.clone();			
image.copyTo(m1);
m1 = image;			

常见的图像复制,有以上三种形式,主要涉及到两个函数:Mat().clone() 和 Mat().copyto(Mat())。
其中,clone()函数是在要进行复制的图像上使用,然后赋值给一个Mat()变量;copyTo()函数也是在原图像上使用,然后参数是一个Mat类型的变量,这个传入变量就获得了原图像的数据。
然后来看第三种,也就是直接赋值的方式,其实并不可取。这是因为这种复制方式,使得实际上的m1和image是同一张图像,他们指向的是同一块内存,当对m1进行修改时,image同样会被修改,这属于浅复制。
而完成前面两个复制方式后,m1和image的图像虽然是一样的,但是他们指向的并不是同一块内存,也就是说这两种方式复制之后会新开辟一块内存来存放数据。当对m1进行修改时,并不会对原图image进行修改。这两种复制方式属于深复制。

3、最后是图像的创建,代码如下:

	Mat m2 = Mat::zeros(Size(400, 300), CV_8UC3);
	Mat m3 = Mat::ones(Size(512, 512), CV_8UC3);
	Mat m4 = Mat::zeros(image.size(), image.type());

创建空图像主要有两个函数,一个是Mat::zeros(),一个是Mat::ones()。顾名思义,zeros()生成一个指定大小、指定深度的全为0的Mat对象,也就是一张全黑的图像;而ones()生成一个指定大小、指定深度的全为1的Mat对象,也就是一张全白的图像。
这两个函数的参数一致,第一个参数是生成图像的尺寸,其中可以传入一个Size对象,也可以传入原有图像的尺寸,使用.size()函数来获取图像的尺寸。当使用Size对象时需要注意他的两个参数位置,分别是Size(int width, int height),也就是图像的宽度和高度。
第二个参数是生成图像的深度,生成RGB图像一般是使用CV_8UC3,意思是8位的三通道的uchar类型。也可以通过.type()函数来获取原有图像的深度并作为参数传入。

好的今天就先记录到此,下次学习之余有空再来更新笔记啦~

PS:本人的注释比较杂,既有自己的心得体会也有网上查阅资料时摘抄下的知识内容,所以如有雷同,纯属我向前辈学习的致敬,如果有前辈觉得我的笔记内容侵犯了您的知识产权,请和我联系,我会将涉及到的博文内容删除,谢谢!

你可能感兴趣的:(学习笔记,c++,opencv,计算机视觉)