前言

  在前文中给出了一个非常简短的视频播放程序,但它没有实现常规视频播放器中的播放滚动条功能,本文对此视频播放器程序加以改进,实现此功能。

滚动条的实现思路

  滚动条的功能实质上就是从一帧跳跃到另外一帧,它的实现框架大致是这样的:

  1. 首先要定义一个全局变量,在每次滚动条位置发生改变时将新的位置记录下来。

  2. 然后定义一个回调函数 ,这个回调函数会在滚动条位置发生改变时自动执行。本文的程序中,回调函数具体的作用就是把程序的当前帧序更新为 1 中获取到的新的帧序。

  3. 获取当前的总帧数。

  4. 以 2 和 3 中获取到的结果等信息为参数,创建一个滚动条。

  至此,滚动条功能就创建好了,别忘了,本文程序可是要求滚动条随着视频的播放而自动推进的。

代码示例

 // 此头文件包含图像IO函数的声明
#include "highgui.h"
// 此头文件包含基本的图像处理函数和高级计算机视觉算法
#include "cv.h" // 滚动条初始位置
int g_slider_position = ;
// 视频结构体
CvCapture * g_capture = NULL;
// 当前帧序
int frameCur = ; void onTrackbarSlide (int pos) { // 设置视频结构体的相关属性
cvSetCaptureProperty (
g_capture, // 视频结构体
CV_CAP_PROP_POS_FRAMES, // 以帧为单位计量
pos // 新的位置
);
// 更新当前帧序
frameCur = pos;
} int main (void) { // 定义一个窗口来播放视频
cvNamedWindow ("示例", CV_WINDOW_AUTOSIZE ); // 将 D 盘目录下名为" 1.avi "的视频加载至内存并获得一个指向该视频内存块的指针,将它返回给 g_capture
// 该指针所指向的结构包含了此视频的当前播放帧序
g_capture = cvCreateFileCapture ("D:\\1.avi"); // 获取视频文件的总帧数
// 第一个参数为视频结构体;第二个参数为需要获取的属性标识( 本例为总帧数 )
int frames = (int) cvGetCaptureProperty (
g_capture,
CV_CAP_PROP_FRAME_COUNT
); // 创建滚动条
// 第一个参数为滚动条标题;第二个参数为滚动条所在窗口名;第三个参数为初始滑块位置
// 第四个参数为滑块总帧数;第五个参数为当滚动条发生改变时要调用的回调函数。
if (frames != ) {
cvCreateTrackbar (
"位置",
"示例",
&g_slider_position,
frames,
onTrackbarSlide
);
} // 定义一个图像指针来指向各帧图像
IplImage *frame; while () { // 获取视频最新的帧图。这个帧图是存放在视频内存块里的,因此,程序结束时只释放 capture 所指向的内存块就够了。
frame = cvQueryFrame (g_capture); // 更新滚动条位置
cvSetTrackbarPos(
"位置", // 滚动条所在窗口
"示例", // 滚动条标题
frameCur++ // 滚动条位置
); // 读取帧失败则退出程序
if (!frame) break; // 显示最新获取到的帧图
cvShowImage ("示例", frame); // 用户键入ESC后退出循环,键入其他按键播放下一帧,什么都不按则 33 毫秒之后自动播放下一帧。
char c = cvWaitKey();
if (c==) break;
}; // 释放空间
cvReleaseCapture (&g_capture);
cvDestroyWindow ("示例");
}

运行测试

  1. 将格式为 avi 的测试视频拷贝到 D 盘,命名为 "1.avi"。

  2. 运行结果:

  

  3. 可以看到该视频播放程序有了滚动条,且滚动条随着视频的播放而自动推进。

OpenCV 入门示例之三:AVI 视频播放控制的更多相关文章

  1. 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨)  ...

  2. OpenCV 入门示例之二:播放 AVI 视频

    前言 本文展示一个播放 AVI 视频的程序.( 呵呵是 AVI 视频不是 AV 视频噢! ) 代码示例 // 此头文件包含图像IO函数的声明 #include "highgui.h" ...

  3. OpenCV 入门示例之五:一个复杂点的变换

    前言 前文介绍了一个简单的变换.需要注意的是,很多时候,输出和输入图像的格式是不同的( 大小,深度,通道 ).在本文将展示的程序中,对图像进行了缩放( 使用cvPyrDown 函数 ),这种情况下需要 ...

  4. OpenCV 入门示例之四:一个简单的变换

    前言 图像的平滑处理,是计算机视觉中非常重要的操作,本文将展示一个可以对图像进行平滑处理的简单程序.而关于平滑处理深层次的知识,会在以后的文章中重点探讨. 代码示例 // 此头文件包含图像IO函数的声 ...

  5. OpenCV 入门示例之一:显示图像

    前言 本文展示一个显示图像的示例程序,它用于从硬盘加载一副图像并在屏幕上显示. 代码示例 // 此头文件包含图像IO函数的声明 #include "highgui.h" int m ...

  6. 系列文章 -- OpenCV入门教程

     <OpenCV3编程入门>内容简介&勘误&配套源代码下载 [OpenCV入门教程之十八]OpenCV仿射变换 & SURF特征点描述合辑 [OpenCV入门教程之 ...

  7. opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整

    http://blog.csdn.net/poem_qianmo/article/details/21479533 [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调 ...

  8. [OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    http://blog.csdn.net/poem_qianmo/article/details/25560901 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...

  9. 【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑

    http://blog.csdn.net/poem_qianmo/article/details/26977557 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...

随机推荐

  1. 组合模式Composite Pattern(转)

    什么是组合模式呢?简单来说组合模式就是将对象合成树形结构以表示“部分整体”的层次结构,组合模式使用户对单个对象和组合对象使用具有一致性. 组合模式(Composite Pattern)有时候又叫部分- ...

  2. linux命令行下使用vboxmanage安装linux系统

    环境:Ubuntu 15.10 64bit,virtualbox 5.0.16 准备:下载安装好virtualbox,virtualbox-extensions,准备好iso系统文件,如archlin ...

  3. Codeforces Gym101063 F.Bandejao (2016 USP-ICMC)

    F.Bandejao It is lunch time on Mars! Everyone has got that big smile on their faces, all eager to se ...

  4. Codeforces 912E Prime Gift(预处理 + 双指针 + 二分答案)

    题目链接 Prime Gift 题意  给定一个素数集合,求第k小的数,满足这个数的所有质因子集合为给定的集合的子集. 保证答案不超过$10^{18}$ 考虑二分答案. 根据折半的思想,首先我们把这个 ...

  5. luogu P2744 [USACO5.3]量取牛奶Milk Measuring

    题目描述 农夫约翰要量取 Q(1 <= Q <= 20,000)夸脱(夸脱,quarts,容积单位——译者注) 他的最好的牛奶,并把它装入一个大瓶子中卖出.消费者要多少,他就给多少,从不有 ...

  6. OnClick五种事件处理

    (一)内部类 1,布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: ...

  7. fauxbar.bak

    {"options": { "almostdone":"0", "backup_searchEngines":" ...

  8. PostgreSQL 10.0 preview 功能增强

    https://yq.aliyun.com/users/1384833841157402?spm=5176.100239.blogrightarea51131.3.yI7e9d

  9. ie8 不能加载dll的问题解决

    请问是在打开IE的时候提示无法加载DLL文件吗? 请尝试重置IE: 1. 关闭所有Internet Explorer窗口. 2. 单击开始,点击运行,输入inetcpl.cpl,按回车. 3. 点击高 ...

  10. 关于Sending build context to Docker daemon 数据很大的问题

    以往进行docker build的时候都是在新建的文件夹下面进行,这次为了图方便,就直接放在开发根目录下进行build,这样子问题就来了.于是就有了下面的文件大小发送量: Sending build ...