第二个程序:视频
视频显示
程序代码如下:
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
namedWindow("Example2",cv::WINDOW_AUTOSIZE);
VideoCapture cap;
cap.open("fire.mp4");
Mat frame;
while(1)
{
cap >> frame;
if(frame.empty())
break;
cv::imshow("Example2",frame);
if(waitKey(33) >= 0)
break;
}
return 0;
}
编译语句如下:
g++ video.cpp -o video `pkg-config --cflags --libs opencv`
程序运行效果如下:
用OpenCV读取视频和读取图像一样简单,但不同的是需要在循环中不停的读取和刷新图像,并且需要为读取视频添加中断机制
- main中创建了一个VideoCapture对象cap用于读取视频,这个结构可以打开和关闭很多类型的ffmpeg支持的视频文件
- cap.open用于打开视频文件,一旦文件被打开,文件的信息及状态信息都将被存放到cap中,使用该方法打开视频文件之后,cap结构会在视频的开头被初始化
- Mat frame用于保存视频帧信息,循环中,每读取一帧信息,程序就会调用imshow函数将图像显示,并使用waitKey(33)函数控制视频播放帧率为30fps,如果frame中为空(视频文件读取完毕),程序将退出
视频跳转
一般的视频播放器都包含进度条,可以通过拉动进度条来调整播放进度,下一个任务就是为视频播放器添加一个滑动条,通过拖动滑动条来控制播放进度
HighGUI工具提供了许多简单的工具用于处理视频和图像,当然包括滑动条,如果需要创建一个滑动条,只需调用函数createTrackbar(),并指明需要创建它的窗口即可
具体代码如下:
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <fstream>
using namespace std;
using namespace cv;
int slider_position = 0;
VideoCapture cap;
void onTrackbarSlider(int pos,void *)
{
cap.set(CAP_PROP_POS_FRAMES,pos);
}
int main()
{
namedWindow("Example2_2",WINDOW_AUTOSIZE);
cap.open("fire.mp4");
int frames = (int)cap.get(CAP_PROP_FRAME_COUNT);
int tmpw = (int)cap.get(CAP_PROP_FRAME_WIDTH);
int tmph = (int)cap.get(CAP_PROP_FRAME_HEIGHT);
cout << "Video has " << frames << "frames of dimensions("
<< tmpw << "," << tmph << ")" << endl;
createTrackbar("Position","Example2_2",&slider_position,frames,onTrackbarSlider);
Mat frame;
while(1)
{
cap >> frame;
if(frame.empty())
break;
int current_pos = cap.get(CAP_PROP_POS_FRAMES);
setTrackbarPos("Position","Example2_2",current_pos);
imshow("Example2_2",frame);
char c = (char)waitKey(10);
if(c == 27)
break;
}
return 0;
}
程序代码分析:
- 程序开始定义了全局变量cap,以便调用函数createTrackbar函数时,方便访问cap
- 使用cap.get函数可以访问cap结构中存放的视频信息,例如:视频长度,图像宽度和图像高度
- createTrackbar函数用于创建一个滑动条,此函数允许我们给予滑动条一个标签(滑动条最左侧Position)并指定需要放置滑动条的窗口名称,并且指定了滑动条的最大值(此程序中此值为视频帧数)以及回调函数(滑动条移动的时候的响应函数,类似于Qt中的信号槽),如果不需要回调函数可以输入NULL
- setTrackbarPos函数的作用是将cap.get函数获取到的当前帧数显示到滑动条上
编译语句如下:
g++ video_slider.cpp -o video_slider `pkg-config --cflags --libs opencv`
程序运行效果如下: