OpencCV创建专属的视频播放器

要播放视频其实和显示图像一样简单,只要考虑播放视频的时候如何循环地顺序读取视频中的每一帧,并且怎么退出该循环。

由一般看视频经验知道,当我们按ESC(ASCII=27)键就可以退出播放。

另外就是加入控制条,控制视频播放进度。可以考虑记录该段视频的总帧数,然后跳到指定帧的位置,继续读取下一帧。

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int g_slider_position = 0;//滑块的位置
CvCapture *g_capture = NULL;//用g_来定义全局变量,程序可读性更强一些

/*回调函数,使其在滚动条被拖动时调用。
滚动条的位置pos以一个32位整数的形式传进来。
用来更新变量以及重新设置视频读入位置。*/
void onTrackbarSlide(int pos)
{
	cvSetCaptureProperty(
		g_capture,
		CV_CAP_PROP_POS_FRAMES,//此参数表示以帧数来设置读入位置,如果用AVI_RATIO代替FRAMES则以视频长度比例读入
		pos);
}

int main(int argc, char **argv)
{
	cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE);
	g_capture = cvCreateFileCapture("D:\\firststep.rmvb");//确定要读入的RMVB文件,返回一个Capture结构的指针
	int frames = (int)cvGetCaptureProperty(
		g_capture,
		CV_CAP_PROP_FRAME_COUNT
		);
	if (frames != 0){
		cvCreateTrackbar(		//创建滚动条
			"Position",	//滚动条的名称
			"Example1",//滚动条所属的窗口
			&g_slider_position,
			frames,
			onTrackbarSlide
			);
	}
	IplImage *frame;
	while (1)
	{
		frame = cvQueryFrame(g_capture); /*cvQueryFrame函数用来将下一帧视频文件
										 载入内存,其实也就是更新CvCapture结构。最后
										 返回一个对于当前帧的指针*/
		if (!frame)break;
		cvShowImage("Example1", frame);
		char c = cvWaitKey(33);//每一帧显示后等待33ms
		if (c==27) break;//如果按键是ESC键(ASCII=27),循环被退出,读入视频停止
	}
	cvReleaseCapture(&g_capture);
	cvDestroyWindow("Example1");
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值