播放AVI视频

#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
int main() {
cvNamedWindow("Example2", CV_WINDOW_AUTOSIZE);
CvCapture * capture = cvCreateFileCapture("D:\\OpenCVT\\1.mp4");
IplImage * frame;
while (1) {
frame = cvQueryFrame(capture);
cvShowImage("Example2", frame);
char c = cvWaitKey(33);
if (c == 27)
break;
}
cvReleaseCapture(&capture);
cvDestroyWindow("Example2");
}

cvCreateFileCapture()

设置要读入的AVI文件,返回一个指向CvCapture结构的指针。这个结构包括了所有要读入AVI文件的信息。

在调用这个函数后,返回指针所指向的CvCpature结构被初始化到所对应的AVI文件的开头

frame=cvQueryFrame(capture);

一旦进入while(1)循环边开始读取AVI文件,cvQueryFrame的参数为CvCapture结构的指针。用来将下一帧

视频文件载入内存(填充或更新的CvCapture结构)。返回一个当前帧的视频。与cvLoadImage不同的是,

cvLoadImage为图像分配内存空间,而cvQueryFrame使用已经在cvCapture结构中分配好的内存。

c=cvWaitKey(33)

if(c==27) break;

当前帧被显示后,会等待33ms.如果其间用户触发了一个按键,c会被设置成这个按键的ASCLL码,否则c会

被设置成-1.如果用户触发了ESC键(ASCLL27)循环会被退出,读入视频停止,否则33ms后继续循环。

cvReleaseCapture(&capture);

退出循环体(视频文件已经读入结束或者用户触发了Esc键)后,我们应该释放为CvCapture结构开辟的内存

空间,这同时也会关闭所有打开的AVI文件相关的文件句柄。

视频播放控制

加一个滚动条来拖动视频,通过cvCreateTrackbar()来创建一个滚动条,并且通过设置参数确定滚动条所属于的窗口。

#include<iostream>
#include<opencv2/core/core.hpp>
#include<cv.h>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
int g_slider_position = 0;
CvCapture* g_capture = NULL;
void onTrackbarSlide(int pos) {
cvSetCaptureProperty(
g_capture,
CV_CAP_PROP_POS_FRAMES,
pos);
}
int main() {
cvNamedWindow("Example3", CV_WINDOW_AUTOSIZE);
g_capture = cvCreateFileCapture("D:\\OpenCVT\\1.avi");
int frames = (int)cvGetCaptureProperty(
g_capture,
CV_CAP_PROP_FRAME_COUNT
);
if (frames != 0) {
cvCreateTrackbar(
"Position",
"Example3",
&g_slider_position,
frames,
onTrackbarSlide
);
}
IplImage* frame;
while (1) {
frame = cvQueryFrame(g_capture);
if (!frame)break;
cvShowImage("Example3", frame);
char c = cvWaitKey(33);
if (c == 27)
break;
}
cvReleaseCapture(&g_capture);
cvDestroyWindow("Example3");
return 0;
}

  

这种方法本质上是通过添加一个全局变量来表示滚动条位置并且添加一个回调函数更新变量以及重新设置视频读入位置。

我们通过一个调用来创建滚动条和确定回调函数。

最新文章

  1. 使用mysql 命令行,增加 ,删除 字段 并 设置默认值 及 非空
  2. JavaScript学习笔记-自定义集合类
  3. 【代码笔记】iOS-浇花动画
  4. html,xhtml和xml
  5. 2015级C程序设计课程开始了
  6. python 练习 10
  7. 自定义UIAlertView
  8. [转]比较 Rational Unified Process (RUP) 和 Microsoft Solutions Framework (MSF)
  9. [Android][Android Studio] *.jar 与 *.aar 的生成与*.aar导入项目方法
  10. docker 错误
  11. java集合类遍历删除方法测试以及使用场景记录
  12. 接口测试:如何定位BUG的产生原因
  13. 微服务(入门二):netcore通过consul注册服务
  14. 分析easyswoole3.0源码,服务启动为例(一)
  15. 微信小程序,错误{&quot;errMsg&quot;:&quot;request:fail 小程序要求的 TLS 版本必须大于等于 1.2&quot;}
  16. PHP 生成器入门
  17. 强连通缩点— HDU1827
  18. 实现C语言字符串操作的库函数 包括基本的字符串复制 字符串长度 字符串比较等多种函数(C代码)
  19. uvloop —— 超级快的 Python 异步网络框架
  20. Storm简述及集群安装

热门文章

  1. 200. Number of Islands (Graph)
  2. 微信小程序开发-rem转换rpx小工具
  3. 关于viewport我自己的理解
  4. go语言log包的学习(log,Logger)
  5. sqlserver打开对象资源管理器管理的帮助文档的快捷键
  6. 递归函数 day17
  7. mysql-mysqldump命令导出多个数据库结构(实战)
  8. Liunx 重定向,管道符(转)
  9. 在centos7上安装elasticSearch
  10. 安全概念:DMZ(非军事化区,隔离区)