OpenCV4入门系列教程13:视频文件(摄像头)读取与显示

系列教程索引地址:系列索引

上一篇:OpenCV4入门系列教程12:键盘输入waitKey

基础篇的文章处理的对象都是读取的一张图片,那么高级篇的第一篇就是连续图片,即视频.

视频(Video)泛指将一系列静态影像以电信号的方式加以捕捉、纪录、处理、储存、传送与重现的各种技术。连续的图像变化每秒超过24帧(frame)画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,这样连续的画面叫做视频。视频技术最早是为了电视系统而发展,但现在已经发展为各种不同的格式以利消费者将视频记录下来。网络技术的发达也促使视频的纪录片段以串流媒体的形式存在于因特网之上并可被电脑接收与播放。视频与电影属于不同的技术,后者是利用照相术将动态的影像捕捉为一系列的静态照片。

本地视频

VideoCaptur()函数原型:

1
2
3
VideoCapture::VideoCapture()
VideoCapture::VideoCapture(const string& filename)
VideoCapture::VideoCapture(int device)

filename是视频名称(可以是相对路径也可以是绝对路径),device是设备(摄像头等)的编号.

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//--------------------------------------【程序说明】-------------------------------------------
// 程序说明:《OpenCV3编程入门》OpenCV3版书本配套示例程序06
// 程序描述:使用VideoCapture类进行视频读取和播放
// 2014年11月 Created by @浅墨_毛星云
// 2014年11月 Revised by @浅墨_毛星云
// 2015年11月 Second Revised by @浅墨_毛星云
//------------------------------------------------------------------------------------------------

//---------------------------------【头文件、命名空间包含部分】----------------------------
// 描述:包含程序所使用的头文件和命名空间
//-------------------------------------------------------------------------------------------------
#include <opencv2/opencv.hpp>
using namespace cv;

//-----------------------------------【main( )函数】--------------------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始
//-------------------------------------------------------------------------------------------------
int main() {
//【1】读入视频
VideoCapture capture("1.avi");

//【2】循环显示每一帧
while (1) {
Mat frame; //定义一个Mat变量,用于存储每一帧的图像
capture >> frame; //读取当前帧

//若视频播放完成,退出循环
if (frame.empty()) {
break;
}

imshow("Video", frame); //显示当前帧
waitKey(30); //延时30ms
}
return 0;
}

从程序所在的文件夹中读取名称为1.avi的视频文件,然后显示在界面上,视频播放完毕后自动退出程序.

play_video

摄像头

摄像头功能是使用设备id,摄像头的默认id为0.

只需要将上面的代码修改一下就可以了.

1
2
//VideoCapture capture("1.avi");
VideoCapture capture(0);

opencv视频部分使用的是FFmpeg。

效果如下:

camera

获取视频属性信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
// 定义相关VideoCapture对象
VideoCapture capture;
// 读取视频文件
capture.open("beat.mp4");
// 判断视频流读取是否正确
if (!capture.isOpened()){
std::cout << "fail to open video!" << std::endl;
return -1;
}
// 获取视频相关信息-帧数
long nTotalFrame = capture.get(CV_CAP_PROP_FRAME_COUNT);
std::cout << "nTotalFrame = " << nTotalFrame << std::endl;
// 获取视频相关信息-帧像素宽高
int frameHeight = capture.get(CV_CAP_PROP_FRAME_HEIGHT);
int frameWidth = capture.get(CV_CAP_PROP_FRAME_WIDTH);
std::cout << "frameHeight = " << frameHeight << std::endl;
std::cout << "frameWidth = " << frameWidth << std::endl;
// 获取视频相关信息-帧率
double FrameRate = capture.get(CV_CAP_PROP_FPS);
std::cout << "FrameRate = " << FrameRate << std::endl;
cv::Mat frameImg;
// read方法获取显示帧
long nCount = 1;
while (true){
std::cout << " Current frame: " << nCount << std::endl;
capture >> frameImg;
// 判断当前读取文件
if (!frameImg.empty()){
imshow("frameImg", frameImg);
}
else{
break;
}
// 按下键盘上q键退出
if (char(waitKey(1)) == 'q'){
break;
}
nCount++;
}
// 视频释放
capture.release();
return 0;
}

测试结果为:

1
2
3
4
5
6
7
8
9
10
nTotalFrame = 7522
frameHeight = 480
frameWidth = 852
FrameRate = 25
Current frame: 1
Current frame: 2
Current frame: 3
Current frame: 4
Current frame: 5
...

下一篇:OpenCV4入门系列教程14:单窗口显示多幅图像