【OpenCV 4开发详解】视频加载与摄像头调用

本文首发于 “小白学视觉”微信公众号,欢迎关注公众号
本文作者为小白,版权归 人民邮电出版社发行所有,禁止转载,侵权必究!

经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

前面已经介绍如何通过程序读取图像数据,本节将介绍OpenCV中为读取视频文件和调用摄像头而设计的VideoCapture类。

2.3.1视频数据的读取

虽然视频文件是由多张图片组成的,但是imread()函数并不能直接读取视频文件,需要由专门的视频读取函数进行视频读取,并将每一帧图像保存到Mat类矩阵中,代码清单2-27中给出了VideoCapture类在读取视频文件时的构造方式。

代码清单2-27 读取视频文件VideoCapture类构造函数
1.cv :: VideoCapture :: VideoCapture(); //默认构造函数
2.cv :: VideoCapture :: VideoCapture(const String& filename,
3.                                          int 	apiPreference =CAP_ANY
4.                                          )
  • filename:读取的视频文件或者图像序列名称
  • apiPreference:读取数据时设置的属性,例如编码格式、是否调用OpenNI等,详细参数及含义在表2-5给出。

该函数是构造一个能够读取与处理视频文件的视频流,在代码清单2-27中的第一行是VideoCapture类的默认构造函数,只是声明了一个能够读取视频数据的类,具体读取什么视频文件,需要在使用时通过open()函数指出,例如cap.open(“1.avi”)是VideoCapture类变量cap读取1.avi视频文件。
第二种构造函数在给出声明变量的同时也将视频数据赋值给变量。可以读取的文件种类包括视频文件(例如video.avi)、图像序列或者视频流的URL。其中读取图像序列需要将多个图像的名称统一为“前缀+数字”的形式,通过“前缀+%02d”的形式调用,例如在某个文件夹中有图片img_00.jpg、img_01.jpg、img_02.jpg……加载时文件名用img_%02d.jpg表示。函数中的读取视频设置属性标签默认的是自动搜索合适的标志,所以在平时使用中,可以将其缺省,只需要输入视频名称即可。与imread()函数一样,构造函数同样有可能读取文件失败,因此需要通过isOpened()函数进行判断,如果读取成功则返回值为true,如果读取失败,则返回值为false。
通过构造函数只是将视频文件加载到了VideoCapture类变量中,当我们需要使用视频中的图像时,还需要将图像由VideoCapture类变量里导出到Mat类变量里,用于后期数据处理,该操作可以通过“>>”运算符将图像按照视频顺序由VideoCapture类变量复制给Mat类变量。当VideoCapture类变量中所有的图像都赋值给Mat类变量后,再次赋值的时候Mat类变量会变为空矩阵,因此可以通过empty()判断VideoCapture类变量中是否所有图像都已经读取完毕。
VideoCapture类变量同时提供了可以查看视频属性的get()函数,通过输入指定的标志来获取视频属性,例如视频的像素尺寸、帧数、帧率等,常用标志和含义在表2-5中给出。

表2-5 VideoCapture类中get方法中的标志参数
标志参数 简记 作用
CAP_PROP_POS_MSEC 0 视频文件的当前位置(以毫秒为单位)
CAP_PROP_FRAME_WIDTH 3 视频流中图像的宽度
CAP_PROP_FRAME_HEIGHT 4 视频流中图像的高度
CAP_PROP_FPS 5 视频流中图像的帧率(每秒帧数)
CAP_PROP_FOURCC 6 编解码器的4字符代码
CAP_PROP_FRAME_COUNT 7 视频流中图像的帧数
CAP_PROP_FORMAT 8 返回的Mat对象的格式
CAP_PROP_BRIGHTNESS 10 图像的亮度(仅适用于支持的相机)
图像的亮度(仅适用于支持的相机) 11 图像对比度(仅适用于相机)
CAP_PROP_SATURATION 12 图像饱和度(仅适用于相机)
CAP_PROP_HUE 13 图像的色调(仅适用于相机)
CAP_PROP_GAIN 14 图像的增益(仅适用于支持的相机)

为了更加熟悉VideoCapture类,在代码清单2-28中给出了读取视频,输出视频属性,并按照原帧率显示视频的程序,运行结果在图2-6给出。

代码清单2-28 VideoCapture.cpp读取视频文件
1.#include <opencv2\opencv.hpp>
2.#include <iostream>
3.
4.using namespace std;
5.using namespace cv;
6.
7.int main()
8.{
9.	system("color F0");  //更改输出界面颜色
10.	VideoCapture video("cup.mp4");
11.	if (video.isOpened())
12.	{
13.		cout << "视频中图像的宽度=" << video.get(CAP_PROP_FRAME_WIDTH) << endl;
14.		cout << "视频中图像的高度=" << video.get(CAP_PROP_FRAME_HEIGHT) << endl;
15.		cout << "视频帧率=" << video.get(CAP_PROP_FPS) << endl;
16.		cout << "视频的总帧数=" << video.get(CAP_PROP_FRAME_COUNT);
17.	}
18.	else
19.	{
20.		cout << "请确认视频文件名称是否正确" << endl;
21.		return -1;
22.	}
23.	while (1)
24.	{
25.		Mat frame;
26.		video >> frame;
27.		if (frame.empty())
28.		{
29.			break;
30.		}
31.		imshow("video", frame);
32.		waitKey(1000 / video.get(CAP_PROP_FPS));
33.	}
34.	waitKey();
35.	return 0;
36.}
【OpenCV 4开发详解】视频加载与摄像头调用_第1张图片
图2-6 读取视频程序运行结果

2.3.2摄像头的直接调用

VideoCapture类还可以调用摄像头,构造方式如代码清单2-29中所示。

代码清单2-29 VideoCapture类调用摄像头构造函数
1.cv :: VideoCapture :: VideoCapture(int index,
2.                                          int 	apiPreference = CAP_ANY
3.                                          )

通过与代码清单2-27中对比,调用摄像头与读取视频文件相比,只有第一个参数不同。调用摄像头时,第一个参数为要打开的摄像头设备的ID,ID的命名方式从0开始。从摄像头中读取图像数据的方式与从视频中读取图像数据的方式相同,通过“>>”符号读取当前时刻相机拍摄到的图像。并且读取视频时VideoCapture类具有的属性同样可以使用。我们将代码清单2-28中的视频文件改成摄像头ID(0),再次运行代码清单2-28的程序,运行结果如图2-7所示。

【OpenCV 4开发详解】视频加载与摄像头调用_第2张图片
图2-7 调用摄像头程序运行结果

 

OpenCV 4开发详解
往期推荐
【OpenCV 4开发详解】Windows系统中安装OpenCV 4
【OpenCV 4开发详解】Ubuntu系统中安装OpenCV 4
【OpenCV 4开发详解】opencv_contrib扩展模块的安装
【OpenCV 4开发详解】Image Watch插件的使用
【OpenCV 4开发详解】安装过程中问题解决方案
【OpenCV 4开发详解】了解OpenCV的模块架构
【OpenCV 4开发详解】Mat类介绍
【OpenCV 4开发详解】Mat类构造与赋值
【OpenCV 4开发详解】4种读取Mat类元素的的方法
【OpenCV 4开发详解】图像的读取与显示
经过几个月的努力,市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》将春节后由人民邮电出版社发行。如果小伙伴觉得内容有帮助,希望到时候多多支持!
关注小白的小伙伴可以提前看到书中的内容,我们创建了学习交流群,欢迎各位小伙伴添加小白微信加入交流群,添加小白时请备注“学习OpenCV 4”。

你可能感兴趣的:(OpenCV,4开发详解)