完成视频播放功能,需要加入一个滚动条实现。
通过调用cvCreateTrackbar()来创建一个滚动条,获得所需的功能只需要提供一个回调函数。
#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>
#include<highgui.h>
#include <cv.h>
using namespace cv;
using namespace std;
//定义全局变量
int g_slider_position=0;//定义滚动条位置
CvCapture *g_capture=NULL;//定义avi视频的文件途径
void onTrackbarSlide(int pos){
cvSetCaptureProperty(//这是设置滚动条的基本参数
g_capture,//视频参数
CV_CAP_PROP_POS_FRAMES,//以帧数读取文件
pos//这是指针位置
);
}
int main(int argc,char **argv){
cvNamedWindow("video1",CV_WINDOW_AUTOSIZE);//创建窗口
g_capture=cvCreateFileCapture("bike.avi");//读取avi视频文件
int frames=(int) cvGetCaptureProperty(
g_capture, //capture文件名
CV_CAP_PROP_FRAME_COUNT //视频帧总数
);
if(frames!=0){
cvCreateTrackbar(
"position",
"video1",
&g_slider_position,
frames,
onTrackbarSlide
);
}
IplImage *frame ;
while(1){
frame=cvQueryFrame(g_capture);
if(!frame)break;
onTrackbarSlide(g_slider_position);
g_slider_position++;
cvShowImage("video1",frame);
char c=cvWaitKey(33);
if(c==27)break;
}
cvReleaseCapture(&g_capture);
cvDestroyWindow("video1");
}
若如果需要实现滚动条随着视频播放移动功能包含进来,一个最简单的方法就是把cvCreateTrackbar的代码插入到帧循环里面。可看下面的例子。
#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>
#include<highgui.h>
#include <cv.h>
using namespace cv;
using namespace std;
//定义全局变量
int g_slider_position=0;//定义滚动条位置
CvCapture *g_capture=NULL;//定义avi视频的文件途径
void onTrackbarSlide(int pos){
cvSetCaptureProperty(//这是设置滚动条的基本参数
g_capture,//视频参数
CV_CAP_PROP_POS_FRAMES,//以帧数读取文件
pos//这是指针位置
);
}
int main(int argc,char **argv){
cvNamedWindow("video1",CV_WINDOW_AUTOSIZE);//创建窗口
g_capture=cvCreateFileCapture("bike.avi");//读取avi视频文件
int frames=(int) cvGetCaptureProperty(
g_capture, //capture文件名
CV_CAP_PROP_FRAME_COUNT //视频帧总数
);
if(frames!=0){
cvCreateTrackbar(//创建滑动条
"position",
"video1",
&g_slider_position,//初始滑动位置
frames,
onTrackbarSlide
);
}
IplImage *frame ;
while(1){
frame=cvQueryFrame(g_capture);
if(!frame)break;
onTrackbarSlide(g_slider_position);
g_slider_position++;
cvCreateTrackbar(
"position",
"video1",
&g_slider_position,
frames,
onTrackbarSlide
);
cvShowImage("video1",frame);
char c=cvWaitKey(33);
if(c==27)break;
}
cvReleaseCapture(&g_capture);
cvDestroyWindow("video1");
}