OpenCV 入门示例之三:AVI 视频播放控制
前言
在前文中给出了一个非常简短的视频播放程序,但它没有实现常规视频播放器中的播放滚动条功能,本文对此视频播放器程序加以改进,实现此功能。
滚动条的实现思路
滚动条的功能实质上就是从一帧跳跃到另外一帧,它的实现框架大致是这样的:
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 视频播放控制的更多相关文章
- 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨) ...
- OpenCV 入门示例之二:播放 AVI 视频
前言 本文展示一个播放 AVI 视频的程序.( 呵呵是 AVI 视频不是 AV 视频噢! ) 代码示例 // 此头文件包含图像IO函数的声明 #include "highgui.h" ...
- OpenCV 入门示例之五:一个复杂点的变换
前言 前文介绍了一个简单的变换.需要注意的是,很多时候,输出和输入图像的格式是不同的( 大小,深度,通道 ).在本文将展示的程序中,对图像进行了缩放( 使用cvPyrDown 函数 ),这种情况下需要 ...
- OpenCV 入门示例之四:一个简单的变换
前言 图像的平滑处理,是计算机视觉中非常重要的操作,本文将展示一个可以对图像进行平滑处理的简单程序.而关于平滑处理深层次的知识,会在以后的文章中重点探讨. 代码示例 // 此头文件包含图像IO函数的声 ...
- OpenCV 入门示例之一:显示图像
前言 本文展示一个显示图像的示例程序,它用于从硬盘加载一副图像并在屏幕上显示. 代码示例 // 此头文件包含图像IO函数的声明 #include "highgui.h" int m ...
- 系列文章 -- OpenCV入门教程
<OpenCV3编程入门>内容简介&勘误&配套源代码下载 [OpenCV入门教程之十八]OpenCV仿射变换 & SURF特征点描述合辑 [OpenCV入门教程之 ...
- opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
http://blog.csdn.net/poem_qianmo/article/details/21479533 [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调 ...
- [OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
http://blog.csdn.net/poem_qianmo/article/details/25560901 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...
- 【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑
http://blog.csdn.net/poem_qianmo/article/details/26977557 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...
随机推荐
- Magenta源代码笔记(3) —— 内存管理【转】
转自:http://blog.csdn.net/boymax2/article/details/52550197 版权声明:本文为博主原创文章,未经博主允许不得转载. Magenta内核支持虚拟地址的 ...
- spingboot 邮件模板发送;
<!-- 邮件start --><dependency> <groupId>javax.mail</groupId> <artifactId> ...
- 阻止关闭窗口,FormCloseQuery
procedure TfrmTopJdsMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin ) = mrNo then ...
- centos7下配置时间同步服务器
同网段20几台服务器: 其中有一组mysql 集群中 互为主从 选一台mysql master 作为时间同步的服务器,这样做的好处以便于这台down了 另一个与他互为主从的master 继续提供时间同 ...
- Android 读取手机联系人、拨号、发送短信及长按菜单的操作
本示例实现了读取手机联系人,拨号.发送短信及长按出现菜单选项的操作↓ 1.Andrid项目结构图↓主要操作图中红色方框内的文件. 2.首先布局代码如下↓ a, main.xml 程序运行的主界面,主要 ...
- 转载——Visiual Studio2012 CLR20r3问题
看到有更新,习惯性的点了,升级到Visiual Studio Ultimate 2012 Update 1,并且按照提升重启了电脑.因为昨天太晚,也没验证.尽早打开VS,结果直接Crash.错误如下: ...
- HDU 1025 Constructing Roads In JGShining's Kingdom[动态规划/nlogn求最长非递减子序列]
Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65 ...
- 转:GEF 英文全称Graphical Editor Framework
http://blog.csdn.net/chancein007/article/category/2713827
- 求用delphi编写的LRC校验位算法函数,急!!!
求用delphi编写的LRC校验位算法函数,急!!! 某命令串为":010200000001FC" 其16进制为“3A 30 31 30 32 30 30 30 30 30 30 ...
- 如何在SQLite中创建自增字段
SQLite 简单的回答:一个声明为 INTEGER PRIMARY KEY 的字段将自动增加. 这里是详细的答案: 从 SQLite 的 2.3.4 版本开始,如果你将一个表中的一个字段声明为 ...