播放一个视频并用滚动条控制进度-OpenCV应用学习笔记二

今天我们来做个有趣的程序实现:利用OpenCV读取本地文件夹的视频文件,并且在窗口中创建拖动控制条来显示并且控制视频文件的读取进度。
此程序调试花费了笔者近一天时间,其实大体程序都已经很快写出,结果执行时却出现拖动条不能控制视频读取进度现象,结果发现是”一个大小写字母引发的血案“——在创建拖动条时命名为:Position,但是在设置拖动条的视频位置时却疏忽写为:position。为此笔者反复了N遍,由此可见程序的严格性,以及“搬砖码垛”时专注的重要性。
同样在附上程序之前我们有必要对程序中出现的关键函数给出深度解析,这个也会成为笔者对于学习笔记的博客书写风格:开篇小叙——程序实现功能——关键函数精析——附上完整测试程序;如果有更好的书写方案希望与大家不吝赐教,唯一的目的就是为了让技术道路上的我们能更快的从彼此哪里获取实用信息,这个也是衡量一个大牛是否技术精通的重要指标:所谓的助攻能力!!!共勉之
实现功能:
输入avi2.exe play2.avi命令符后,执行:Example2窗口播放play2.avi视频文件,并且在Position拖动条上显示进度,手动拖动能调节对应视频播放进度。

函数精析:
cvCreateFileCapture(const char* filename)/cvCaptureFromAVI(const char* filename)
- 从指定文件filename中获取视频流,分配和初始化CvCaputure*结构指针
- 两个函数等价,实现从文件夹中读取视频流;同时支持多种视频格式AVI、MP4、wmv等
- 只分配一帧的图像空间,每次调用时覆盖前面一次的数据(每次调用返回的指针是一样的)
- 倘若我们想分配自己的图像存储空间用:cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,3)-《笔记一》
cvCaptureFromCAM(int index)
- 从摄像头中获取视频,多个摄像头的编号index;本地index=0;外部index=1
cvSetCaptureProperty(CvCapture* capture, int propId, double value)
- 设置视频的属性 (视频对象,属性标识符,属性)
- CV_CAP_PROP_POS_MSEC:视频当前位置,毫秒或者视频获取时间戳
- CV_CAP_PROP_POS_MSEC:将被下一步解压获取的帧索引,以0为起点
- CV_CAP_PROP_POS_AVI_RATIO:视频文件相对位置(0开头1结尾)
- propId可取值如下:

cvGetCaptureProperty(CvCapture* capture, int propId)
- 获取视频属性;propId同样适用上图
cvCreateTrackbar(barName, win1, int* value, int count, CvTrackbarCallback onChange)
- 创建拖动条(拖动条标识符,窗口标识符,拖动条位置数字指针,最大位置,调用函数更新拖动后的位置)
- 在win1窗口创建拖动条barName,count为其最大值,value为其当前值,onChange跟新拖动后的位置
cvSetTrackbarPos(barName,win1, int pos)
- 设置win1窗口下barName拖动条的最新位置pos
cvQueryFrame(g_capture)
- 从读取的视频流g_capture中读取一帧,并且解压返回这一帧,返回的图像可以被释放和修改
cvRetrieveFrame(g_capture)
- 返回抓取图像的指针,但是返回的图像不能被释放和修改
- 利用cvCloneImage()后可以对抓取的图像进行任何操作
cvGrabFrame(g_capture)
- 捕捉视频或者相机的下一帧图像,尤其是应用在多相机的情况下
附源代码:
#include "stdafx.h"
#include "highgui.h"
#include "cv.h"
#include <iostream>
using namespace std; /* 声明三个全局变量并初始化 */
int g_slider_position //定义拖动条当前位置变量
int frame_count =; //定义一个全局变量,控制滚动条的位置
CvCapture *g_capture = NULL; /* 定义拖动条函数:设置视频获取信息(对指定视频g_capture
设置属性标识符CV_CAP_PROP_POS_FRAMES的值pos) */ void onTrackbarSlide(int pos)
{
cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);
frame_count = pos; //将设置的视频信息中的属性值保存到frame_count中
return;
} int main(int argc,char** argv)
{
if(argc == )
{ cvNamedWindow("Example2",);
g_capture = cvCaptureFromAVI(argv[]);
// cvCreateFileCapture(argv[1]); 读入AVI文件等价
int frames = (int) cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT);
//获取视频文件属性的总帧数
if(frames != )
{
/* "position"表示滚动条的名词,"Example3"表示滚动条所属窗口,
g_slider_position表示滚动条当前位置。 frames表示滚动条的最大值,
onTrackbarSlide表示滚动条的回调函数(被拖动时调用) */ cvCreateTrackbar("Position","Example2",&g_slider_position,frames,onTrackbarSlide);
} IplImage* frame = NULL ;
while() //实时捕捉视频帧显示,并且更新进度条
{
frame = cvQueryFrame(g_capture);//获得一帧图像
if(!frame) break;
cvShowImage("Example2",frame); cvSetTrackbarPos( "Position", "Example2", frame_count++ );
/* 进度条根据视频进度跟新位置
拖动条设置的时候跟之前的创建名称不同导致拖动条不能根据
视频进度更新调试了一天终于发现这里“position”应该为“Position”
cout << g_slider_position << endl ;//可以看到为止更新数据 */ char c = cvWaitKey(); //按下esc后退出
if( c == )break; }
}
cvReleaseCapture(&g_capture);
cvDestroyWindow("Example2");
return ;
}
播放一个视频并用滚动条控制进度-OpenCV应用学习笔记二的更多相关文章
- OpenCV入门学习笔记
OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...
- Android NDK开发及OpenCV初步学习笔记
https://www.jianshu.com/p/c29bb20908da Android NDK开发及OpenCV初步学习笔记 Super_圣代 关注 2017.08.19 00:55* 字数 6 ...
- OpenCV图像处理学习笔记-Day1
OpenCV图像处理学习笔记-Day1 目录 OpenCV图像处理学习笔记-Day1 第1课:图像读入.显示和保存 1. 读入图像 2. 显示图像 3. 保存图像 第2课:图像处理入门基础 1. 基本 ...
- OpenCV图像处理学习笔记-Day03
OpenCV图像处理学习笔记-Day03 目录 OpenCV图像处理学习笔记-Day03 第31课:Canny边缘检测原理 第32课:Canny函数及使用 第33课:图像金字塔-理论基础 第34课:p ...
- OpenCV图像处理学习笔记-Day4(完结)
OpenCV图像处理学习笔记-Day4(完结) 第41课:使用OpenCV统计直方图 第42课:绘制OpenCV统计直方图 pass 第43课:使用掩膜的直方图 第44课:掩膜原理及演示 第45课:直 ...
- 视频文件写入转换之图像处理-OpenCV应用学习笔记五
在<笔记二>中我们做了视频播放和控制的实现,仅仅算是完成了对视频文件的读取操作:今天我们来一起练习下对视频文件的写入操作:格式转换. 实现功能: 打开一个视频文件play.avi,读取文件 ...
- OpenCV学习笔记(二) - 写入视频、jpg格式
写入视频: import sys, os import cv2 imgDir = '/Users/xxx/salient/' videoName = 'vname' fps = 30 #帧频 outp ...
- opencv的学习笔记5
总结原博文中的一些边缘检测算子和滤波器.(Canny算子, Sobel算子, Laplace算子以及Scharr滤波器) 首先,一般的边缘检测包括三个步骤: 1)滤波:边缘检测的算法主要是基于图像 ...
- opencv的学习笔记3
CMake是一个比make更高级的编译配置工具,它可以根据不同平台.不同的编译器,生成相应的Makefile或者vcproj项目.通过编写CMakeLists.txt,可以控制生成的Makefile, ...
随机推荐
- TTL、RS232、RS485、串口
Point: 1.串口.COM口是指的物理接口形式(硬件).而TTL.RS-232.RS-485是指的电平标准(电信号). 2.接设备的时候,一般只接GND RX TX.不会接Vcc或者+3.3v的电 ...
- 被忽略的js细节
今天在写一个程序,出了一点小bug,找了许久许久,终于把问题给揪了出来,真相大白那一刻感觉好蛋疼--深刻体会到了语言之间的差异. <script type="text/javascri ...
- 08JAVA多态
//我并没有用多态,因为我也不知道怎么用多态实现ATM操作流程/* * 模拟ATM机 * 徐浩军 20153153 */ package 中转; import java.util.Scanner; p ...
- Java-计划存储
Hive:Hive文档 Hdfs官方 Spark官方 About云中文论坛 书单:2015豆瓣书单 豆瓣千人8.0+书单 编程入口:Eclipse servlet java8 快捷键整理 MyBat ...
- [转载]赖勇浩:推荐《Linux 多线程服务器端编程》
推荐<Linux 多线程服务器端编程> 赖勇浩(http://laiyonghao.com) 最近,有一位朋友因为工作需要,需要从网游的客户端编程转向服务器端编程,找我推荐一本书.我推荐了 ...
- svn没有对号等符号的问题
文件夹--右键->TortoiseSVN->Settings => 弹出一个对话框,在对话框中左边框中有一个Icon Overlays->Overlay Handlers ...
- 《笨办法学C》笔记之Makefile
使用gcc编译C语言源码 在Linux系统中,C语言源码需要用gcc编译为二进制可执行文件,才能够运行. $ gcc test.c -o test 这句命令就将test.c文件编译为test二进制可执 ...
- React阶段开发总结
这次独立编写了React页面主要是数据切换.点击不同的按钮,Ajax请求不同的后台数据.数据驱动表格内容的显示.使用React组件开发. 开发中获得下面的心得: 1.后台给的地址早一点添加路由(写好数 ...
- JAVA中protected的作用
JAVA中protected的作用 1.public:public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private:private表示私有,私有的意思就是 ...
- (shell )函数
一.定义格式 [function] 函数名() { 命令表 } 二.调用方法 先定义,后使用,直接输入函数名,不需要圆括号() 三.函数参数传递方法 可以利用位置参数或者变量进行传递 #! /bin/ ...