【OpenCV学习记录】1.视频播放可控制

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(中文版)》[美] 安德里安·凯勒、加里·布拉德斯基 著 , 阿丘科技、刘昌祥、吴雨培、王成龙、崔玉芳 等译,清华大学出版社。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值