HighGUI编写视频播放器实战分析——关于老师所布置作业的一些思考


前言

这周,OpenCV的老师在讲完HighGUI模块后,布置了一个作业。
在这里插入图片描述


当然,因为自己编程基础不太牢固,去网络上寻找了很多的代码,但是鱼龙混杂,错误一堆,借鉴了其中一些优秀大佬的思想,自己编程调试了很久,终于基本成功了,也想分享一下这个过程中的一些感想。本文仅介绍老师留的基础作业,挑战作业会另外开贴细说(和OpenCV本身关系不大)。

分析题目

我们来看看题目对最后视频播放器程序实现的三个要求:
在这里插入图片描述

要求一:滑动条控制视频播放

由于在OpenCV中实现视频播放的方法是将视频一帧一帧提取出来播放,因此联想到,如果使用滑动条控制视频的进度,最方便的办法是将进度条代表的的值为视频的当前帧,正好HighGUI模块中有对应的函数。
从上面的分析中可知,我们可以将滑动条的回调函数设置成视频的当前帧数:

void onTrackbackSlide(int poss, void*) {
   
	cap.set(CAP_PROP_POS_FRAMES, poss);//将视频当前显示的帧位置的int值赋给poss
}

由于创建滑动条时需要有个最大值,在该例子中为视频的总帧数(视频最后的帧位置)所以可以编写以下一段代码:

int totalframe = cap.get(CAP_PROP_FRAME_COUNT);

接下来就可以创建滑动条,在创建滑动条(假设名字为”FPS“)后,需要在循环中加入以下一段代码,这样滑动条就会跟着视频动:

int currentpos = (int)cap.get(CAP_PROP_POS_FRAMES);
				setTrackbarPos("FPS", "test2", currentpos);

要求二:鼠标控制视频的暂停和播放

这是在编写程序中最让我头疼的事情,后来借鉴了网络上的某种方法能够让程序接到鼠标指令后一直跑空循环,同时在接收到鼠标的另一指令后重新开始循环,大概的实现思想如下:
首先定义一个全局变量play=-1,在循环中加上if(play!=0),在每次循环结束后让play减1,只要让play=1,那么在显示一帧后能够一直跑空循环,即暂停,若让play重新等于-1,那么程序继续循环。
假设相应的操作是左键暂停,右键播放,鼠标的回调函数如下(假设鼠标返回值为a):

void on_mouseevent(int event, 
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值