OpenCV学习笔记基础篇(一):Mat类、图片读入

前言:

笔者目前在校本科大二,有志于进行计算机视觉、计算机图形学方向的研究,准备系统性地、扎实的学习一遍OpenCV的内容,故记录学习笔记,同时,由于笔者同时学习数据结构、机器学习等知识,会尽量根据自己的理解,指出OpenCV的应用,并在加上自己理解的前提下进行叙述。
若有不当之处,希望各位批评、指正。


本篇学习内容:

1.Mat类
2.图片读入


1.Mat类

1.1 Mat类简述

Mat类可以看作OpenCV中用于保存矩阵数据的一个结构。那么理所当然,它极适合作为一种图像存储容器,用于保存图片数据等。
Mat类提供了多种构造方式,也提供了多个参数,让使用者可以指定矩阵大小、数据类型等。

1.2 Mat的一些例子

Mat作为一个类,有各种构造函数重载,也有operator=重载等函数,同样也有各种类内函数如clone()等。
Mat之间可以做各种运算,如:数学中的矩阵乘法即对应operator*,a.dot(b)表示内积,a.mul(b)表示对应位的乘积等。
有多种方式可以访问Mat类中元素。如at,指针读取,迭代器访问等。

由于我现阶段主要运用Mat来读取图片,所以这些构造方法仅写一些示例。代码如下:

Mat A = Mat_<double>(3, 3);//创建一个3*3的矩阵,数据类型为double
Mat b(40, 30, CV_8UC3,cv::Scalar(100,100,100));//8UC3即表示 8位无符号整数,且通道数为3
Mat c = b.clone();//复制两个一样的Mat类而彼此不受影响
Mat d = c;
//在创建一个Mat类时,其实是创建一个矩阵头,这个矩阵头的指针会指向一些数据。
//这里以operator=的形式,实际上是将c矩阵头的内容复制到d中,
//此时d和c的矩阵指针指向同一个矩阵数据,所以对c进行改变,同时会改变d的值。
//若删除c,d并不会指向空数据,这是因为矩阵头会采用引用次数来释放存储内容。这里先不过多涉及
c = c * 2;
cv::imshow("t1", b);
cv::imshow("t2", c);
cv::imshow("t3", d);
waitKey(0);
return 0;

运行结果:
OpenCV学习笔记基础篇(一):Mat类、图片读入_第1张图片

2.图片读入

2.1 读取图片

当然,如果只是想要读取一张图片,是很简单的。代码如下:

Mat image = imread("E:/program/x.jpg");//参数为文件路径

显示图片:

imshow("img",image);//显示一张图片,第一个参数为窗口名,第二个参数为要显示的图片
waitKey(0);//所显示的窗口无限等待,直到用户输入一个按键。默认值为0。等待时间为ms

仅用这三行代码,就可以显示出想要的图片。

下面来正式介绍这几个函数:

imread()有两个参数:const String & filename 与 int flags = IMREAD_COLOR
flag为载入标识,改变flag会改变imread读取图片的方式。官方文档中给出的flag如下图:OpenCV学习笔记基础篇(一):Mat类、图片读入_第2张图片
就我个人理解而言,通常使用IMREAD_GRAYSCALE(等价取值为0)和IMREAD_COLOR(等价取值为1)就足够了。

对于这种文档,我个人的见解是了解即可,不必记住。原因有二:

1.在特定项目下,所需要读取的图片格式常常是固定的。
2.在不知道该以何种格式读取时,查阅文档即可。查一次即可用于整个项目。

至于后面的IMREAD_REDUCED_COLOR2用于缩小图片尺寸,似乎并不是很有必要。因为我平常在Python中用的时候都是cv2.resize()

imshow()有两个参数:const Sreing &winname 和 InputArray mat
· winname为要显示的窗口的名字。
· mat为要显示的图像矩阵。
· InputArray可以理解为和Mat类似的一个数据类型。
关于窗口:如果在此函数之前没有创建同名的图像窗口,就会以WINDOW_AUTOSIZE标志创建一个窗口,显示图像的原始大小;如果创建了图像窗口,那么会缩放图像以适应窗口属性。
缩放规则:8U原样显示;16U or 32S 除以256,将范围映射到[0,255];32F or 64F 乘以255.

waitKey()有一个参数:int dalay = 0
·delay为延迟的时间。当它为0时,函数无限地等待。delay的等待单位为毫秒。
关于delay,官方文档这样描述:
Since the OS has a minimum time between switching threads, the function will not wait exactly delay ms, it will wait at least delay ms, depending on what else is running on your computer at that time.
也就是说delay只是至少延迟这么多毫秒,具体延迟了多少取决于你的操作系统和进程等因素。
另外,在读取视频时也会用到waitKey函数。那时,比如设置delay=15即为15ms一帧。

参考文献:

  1. OpenCV官方文档:https://docs.opencv.org/4.x/
  2. 《OpenCV3编程入门》毛星云、冷雪飞等编著
  3. 《OpenCV4快速入门》冯振、郭延宁、吕跃勇著

你可能感兴趣的:(OpenCV学习笔记基础篇,opencv,c++)