本节在上一节的基础上添加滚动条,以实现前进或后退,先上代码:
//
// main.cpp
// Display_Vedio_Control
//
// Created by 黄露 on 16/3/19.
// Copyright © 2016年 huanglu_thu13. All rights reserved.
//
#include "cv.h"
#include "highgui.h"
//定义两个全局变量
//设置滚动条初始位置为0
int g_slider_position = 0;
//全局视频指针
CvCapture * g_capture;
//顶一回调函数,使滚动条拖动时调用
void onTrackbarSlide(int pos){
//通过调用cvSetCaptureProperty设置视频当前播放第pos帧
cvSetCaptureProperty(g_capture,
CV_CAP_PROP_POS_FRAMES,
pos);
}
int main(int argc, const char * argv[]) {
//创建窗口
cvNamedWindow("Vedio", 1);
//创建视频对象,打开视频文件
g_capture = cvCreateFileCapture("/Users/huanglu/Desktop/test.mov");
//============以下为在上一节基础上增加的==============
//获取帧数
int frames = (int)cvGetCaptureProperty(g_capture,
CV_CAP_PROP_FRAME_COUNT);
//创建滚动条
if (frames != 0){
cvCreateTrackbar("position",
"Vedio",
&g_slider_position,
frames,
onTrackbarSlide);
}
//============以上为在上一节基础上增加的==============
//定义指向视频每一帧的图像指针
//只是指针,并没有为其创建内存,其指向视频内存的一部分
IplImage* frame;
while(1){
//加载视频的下一阵帧
frame = cvQueryFrame(g_capture);
//如果加载失败,退出
if(!frame)
break;
//显示该帧图像
cvShowImage("Vedio", frame);
//停顿33ms,这里假设一秒有30帧
char c = cvWaitKey(33);
//如果从键盘输入esc,ASCII值为27,退出
if(c == 27)
break;
}
//释放视频指针
cvReleaseCapture(&g_capture);
//释放窗口
cvDestroyWindow("Vedio");
return 0;
}
其中定义了两个全局变量分别用来记录当前播放帧的位置和指向视频的指针。onTrackbarSlide()通过调用cvSetCaptureProperty()设置视频当前播放第pos帧,cvSetCaptureProperty()的函数声明为:
int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );
其中capture 视频获取结构,value为要设置的参数,property_id 属性标识符,可以是下面之一:
CV_CAP_PROP_POS_MSEC - 从文件开始的位置,单位为毫秒
CV_CAP_PROP_POS_FRAMES - 单位为帧数的位置(只对视频文件有效)
CV_CAP_PROP_POS_AVI_RATIO - 视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾)
CV_CAP_PROP_FRAME_WIDTH - 视频流的帧宽度(只对摄像头有效)
CV_CAP_PROP_FRAME_HEIGHT - 视频流的帧高度(只对摄像头有效)
CV_CAP_PROP_FPS - 帧率(只对摄像头有效)
CV_CAP_PROP_FOURCC - 表示codec的四个字符(只对摄像头有效)
cvGetCaptureProperty函数用来获取视频的属性,其原型为:
double cvGetCaptureProperty( CvCapture* capture, int property_id );
其中,capture 视频获取结构,property_id 属性标识,这里我们获取的帧数,即CV_CAP_PROP_FRAME_COUNT。
函数cvCreateTrackbar用来创建trackbar并将它添加到指定的窗口,其原型为:
int cvCreateTrackbar( const char* trackbar_name, const char* window_name, int* value, int count, CvTrackbarCallback on_change );
其中,trackbar_name 被创建的trackbar名字;window_name 窗口名字,这个窗口将为被创建trackbar的父对象;value 整数指针,它的值将反映滑块的位置,这个变量指定创建时的滑块位置;count 滑块位置的最大值,最小值一直是0;on_change 每次滑块位置被改变的时候,被调用函数的指针,这个函数应该被声明为void Foo(int); 如果没有回调函数,这个值可以设为NULL。
函数cvCreateTrackbar用指定的名字和范围来创建trackbar(滑块或者范围控制),指定与trackbar位置同步的变量,并且指定当trackbar位置被改变的时候调用的回调函数。
被创建的trackbar默认显示在指定窗口的顶端,可以通过函数cvGetTrackbarPos来获取trackbar显示的位置信息,以及通过函数cvSetTrackbarPos来重新设置trackbar的显示位置。