前言

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

滚动条的实现思路

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

  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. duilib入门简明教程 -- XML基础类(7) (转)

    原文转自:http://www.cnblogs.com/Alberl/p/3343743.html 现在大家应该对XML描述界面不那么陌生了,那么我们做进一步介绍. 前面的教程我们写了很多代码,为的是 ...

  2. [java]编程的智慧(转)

    编程是一种创造性的工作,是一门艺术.精通任何一门艺术,都需要很多的练习和领悟,所以这里提出的“智慧”,并不是号称一天瘦十斤的减肥药,它并不能代替你自己的勤奋.然而由于软件行业喜欢标新立异,把简单的事情 ...

  3. Android驱动之 Linux Input子系统之TP——A/B(Slot)协议【转】

    转自:http://www.thinksaas.cn/topics/0/646/646797.html 将A/B协议这部分单独拿出来说一方面是因为这部分内容是比较容易忽视的,周围大多数用到input子 ...

  4. [Python Cookbook] Numpy: Iterating Over Arrays

    1. Using for-loop Iterate along row axis: import numpy as np x=np.array([[1,2,3],[4,5,6]]) for i in ...

  5. JMeter特殊情况二:针对某些请求数据每次请求都是变化的情况

    概要:某些post请求,例如,登录的请求除了有我们再页面上需要输入的一些值(用户名.密码.是否记住密码等)之外,还有其他的参数,例如token等等,而且这些参数不固定,也就是说每一次post请求这些参 ...

  6. Codeforces 869 C The Intriguing Obsession

    题目描述 — This is not playing but duty as allies of justice, Nii-chan! — Not allies but justice itself, ...

  7. HNOI 2006 BZOJ 1195 最短母串

    题面 问题描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 输入 第一行是一个正整数n(n<=12),表示给定的字 ...

  8. Using CLEAR_BLOCK To Prevent Save Confirmation Dialogs In Oracle Forms

    Clear_Block built-in clears all records from the current data block and if the user had made some ch ...

  9. 14.【nuxt起步】-Pm2 和nuxt服务运行

    1.安装pm2 npm install pm2 -gd 2.启动 Pm2 start ./bin/www 3. pm2 save 4.Pm2 startup 5.Pm2 save修改 package. ...

  10. GLSL逐顶点光照[转]

    转载:http://blog.csdn.net/hgl868/article/details/7872350 引言 在OpenGL中有三种类型的光:方向光(directional).点光(point) ...