Fork me on GitHub

OpenCV 笔记(一):图像与视频的输入输出

第一个程序

上一篇 中,我们运行了一个程序,显示一张图片:

1
2
3
4
5
6
7
8
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
// 把下面的 1.jpg 改成自己的图片的名称
Mat img = imread("1.jpg");
imshow("图片", img);
waitKey();
}

其实不要看短短几行就实现了这个功能,但背后的工作其实是非常复杂繁多的。我们一点点来解释。

首先第一行,是一个 #include 声明:

1
#include <opencv2/opencv.hpp>

其实 OpenCV 是有很多模块的,各个模块都有其对应的头文件,而 opencv.hpp 这个头文件就包含了各个模块的头文件,所以这是一个最简洁的写法。

然后可能会有人指出,我在 之前的一篇博客 中,不是说不要使用 using namespace 吗?为什么这里又出现了呢?这是因为我是为了写一个 demo,我就是最终的用户了啊!不违背我的原则 =v=

接下来,声明并初始化了一个 Mat 对象,这个 Mat 对象是 OpenCV 中的 n 维密集数值阵列,可用于储存矩阵、灰度或彩色图像等,我们暂时不深入去了解它,这个部分会放到后面。
初始化调用了一个函数 imread,我们来看看这个函数的声明:

1
Mat imread(const String &filename, int flags = IMREAD_COLOR)

这个函数从一个文件中加载图片,第一个参数是文件名,第二个参数是打开的模式,它有一个缺省值 IMREAD_COLOR,代表将图像转换为三通道的彩色图像,一般使用默认值即可,想了解更多模式可以看 这里

然后是一个 imshow 函数,这个函数会创建一个窗口并显示图像,我们看看它的函数声明:

1
void imshow(const String& winname, InputArray mat);

第一个参数代表窗口的标题,第二个参数代表储存图像的对象。

最后是一个 waitKey 函数,它的函数声明是这样的:

1
int waitKey(int delay = 0)

它用于等待用户输入一个键并返回,delay 代表等待的毫秒数,缺省值为 0,当 delay 为非正数(<=0)时,代表的就是无限等待直到用户输入一个键。

以上就是这部分代码的介绍,其中,imread 属于图像读写部分,可以在 这里 查看更多相关函数的信息;imshowwaitKey 属于 GUI 部分,可以在 这里 查看更多相关函数的信息。

图像处理

我们有了一些直观的认识之后,在来一些感观的认识。官网给出了非常多的关于图像处理的 教程,我们可以都尝试一下,并且它每个例子下面都会有 Explanation,可谓是非常良心了。如果看英文不顺利的童鞋,可以看对应的中文网的教程,会有一些出入,但大体上差不多。

视频处理

我们也可以用一个简短的程序,就能实现一个视频的读取:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// 将 1.mp4 替换成自己的视频文件
VideoCapture capture("1.mp4");
// 循环显示每一帧
while (1)
{
Mat frame;
// 读取当前帧到 frame
capture >> frame;
if (frame.empty())
break;
imshow("视频", frame);
// 每一帧之间的间隔(ms)
waitKey(20);
}
waitKey();
}

运行后它就能像一个播放器一样“播放”整个视频啦!
试试看把

1
VideoCapture capture("1.mp4");

这一句改成

1
VideoCapture capture(0);

会发生什么吧 ^_^
更多视频处理相关内容可以看 这里 哦!

结语

OpenCV 毕竟是一个库,我们学习它,没必要像教科书式的,按顺序去学习它的各个模块、功能。我们想做什么,就直接去做,要用到什么,我们就查文档、查资料。在实践中学习,也是快速成长的一种方式。

-------------------------------- 全文完 感谢您的阅读 --------------------------------
「写的那么辛苦,连一块钱都不打赏吗/(ㄒoㄒ)/~~」