1. 实现功能
用OpenCV播放视频并实现如下控制:
(1)随时结束播放
(2)随时暂停播放
(3)视频滑动条,是用户可以进行视频跳转
(4)通过滑动条跳转到视频一个新的时间点时,在该点暂定
2. 实现代码
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
//函数声明
int showVideo_1(int argc, char** argv);//视频播放函数
void onTrackbarSlide(int pos, void *);//用户调整滑动条时执行的回调程序
//全局变量声明
int g_silder_position = 0;//存储进度条位置
int g_run = 1;//g_run=0暂停视频,g_run>0在多少帧后暂停视频,g_run<0连续播放视频
int g_dontset = 0;
cv::VideoCapture g_cap;//帧读取结构
int main(int argc,char** argv)
{
showVideo_1(argc, argv);
return 0;
}
int showVideo_1(int argc, char** argv)
{//3.显示加进度条的视频
cv::namedWindow("Example3", cv::WINDOW_AUTOSIZE);//创建窗口
g_cap.open(string(argv[1]));//获取视频
int frames = (int)g_cap.get(cv::CAP_PROP_FRAME_COUNT);//获取视频的总帧数
int tmpw = (int)g_cap.get(cv::CAP_PROP_FRAME_WIDTH);//获取视频的宽
int tmph = (int)g_cap.get(cv::CAP_PROP_FRAME_HEIGHT);//获取视频的高
cout << "Video has " << frames << " frames of dimensions( " << tmpw << " , " << tmph << " )." << endl;
//创建滚动条
cv::createTrackbar("Position", "Example3", &g_silder_position, frames, onTrackbarSlide);
//声明可以保存视频帧的结构
cv::Mat frame;
for (;;)
{
if (g_run != 0)
{
//视频文件会按照帧从视频文流中被读取
g_cap >> frame;
//检查数据是不是真的被读取出来
if (frame.empty())break;
//获取滑动条位置
int current_pos = (int)g_cap.get(cv::CAP_PROP_POS_FRAMES);
//使下一个滑动条回调函数不会进入单步模式
g_dontset = 1;
//重置滑动条位置
cv::setTrackbarPos("Position", "Example3", current_pos);
//显示当前帧
cv::imshow("Example3", frame);
//连续播放视频
g_run -= 1;
}
//一旦显示当前帧会等待10毫秒,如果这10毫秒内有“s”,“r”,“esc”输入会执行相应命令
char c = (char)cv::waitKey(10);
if (c == 's')
{//执行单步模式,暂停
g_run = 1;
cout << "Single step, run = " << g_run << endl;
}
if (c == 'r')
{//结束单步模式,连续播放
g_run = -1;
cout << "Run mode, run = " << g_run << endl;
}
if (c == 27)break;//结束视频播放,退出程序
}
return 0;
}
void onTrackbarSlide(int pos, void *)
{ //pos:当前位置,第二个参数是啥???
//移动进度条
g_cap.set(cv::CAP_PROP_POS_FRAMES, pos);
//设置是否进入单步模式
if (!g_dontset)
g_run = 1;
g_dontset = 0;
}
3. 运行结果
4. 问题与总结
(1)书上说进入视频的单步模式,不懂是什么意思,是按一下‘s’键向前播放一帧的意思么?
(2)滑动条的回调函数的第二个参数是什么呢?
请大神们指教~
本文参考书目:
《学习OpenCV3(中文版)》[美] 安德里安·凯勒、加里·布拉德斯基 著 , 阿丘科技、刘昌祥、吴雨培、王成龙、崔玉芳 等译,清华大学出版社。