视频播放控制

来源:互联网 发布:php图片验证码不显示 编辑:程序博客网 时间:2024/05/14 19:32

题目:实现 AVI 播放器播放视频,并通过加入一个滚动条来实现对视频进行快速拖动


1.通过调用 cvCreateTrackbar() 来创建一个滚动条,并且通过设置参数确定滚动条所属于的窗口,为了获取所需的功能,只需要提供一个回掉函数。

2.实现滚动条随着视频播放自动移动


#include "opencv3.h"#include "cv.h"#include "highgui.h"int g_slide_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("E:\\TigerPI\\test.mp4");int frame = cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT);if (frame != 0){cvCreateTrackbar("Position","Example3",&g_slide_position,frame,onTrackbarSlide);}IplImage* frames;int NewPos = g_slide_position;while (1){frames = cvQueryFrame(g_capture);if (!frames)break;cvShowImage("Example3", frames);cvCreateTrackbar("position", "Example3", &NewPos, frame, onTrackbarSlide);/*cvSetTrackbarPos("Position","Example3",g_slide_position++);*/char c = cvWaitKey(33);if (c == 27)break;NewPos++;}cvReleaseCapture(&g_capture);cvDestroyWindow("Example3");return 0;}opencv3::opencv3(){}opencv3::~opencv3(){}



cvCreateTrackbar

 该函数为开放计算机视觉(OpenCV)库库函数,创建trackbar并将它添加到指定的窗口。

  定义:

  CV_EXTERN_C_FUNCPTR( void (*CvTrackbarCallback)(int pos) );

  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的显示位置。

int cvCreateTrackbar(

const char* trackbar_name, //滑动条的名称

const char* window_name,  //窗口的名称,滑动条不会遮挡图像

int* value,                          //当滑动条被拖到时,OpenCV会自动将当前位置所代表的值传给指针指向的整数

int count,                           //滑动条所能达到的最大值

CvTrackbarCallback on_change //可选的回调函数,回调函数可参见

 

其中openCV的highgui库提供了两个函数来读取和设置滚动条的value值

//读取value值

int cvGetTrackbarPos(

const char* trackbar_name,

cosnt char* window_name

);

//设置value值

void cvSetTrackbarPos(

const char* trackbar_name,

const char* window_name,

int pos

);

 

OpenCV中关于cvGetCaptureProperty函数

OpenCV中提供了一个函数cvGetCaptureProperty(Capture* cap,int property_index)函数来获取视频文件的一些属性,这是其中的OpenCV中属性的一些宏定义:

 #define CV_CAP_PROP_POS_MSEC 0

 #define CV_CAP_PROP_POS_FRAMES 1

 #define CV_CAP_PROP_POS_AVI_RATIO 2

 #define CV_CAP_PROP_FRAME_WIDTH 3

 #define CV_CAP_PROP_FRAME_HEIGHT 4

 #define CV_CAP_PROP_FPS 5

 #define CV_CAP_PROP_FOURCC 6

 #define CV_CAP_PROP_FRAME_COUNT 7

 #define CV_CAP_PROP_FORMAT 8

 #define CV_CAP_PROP_MODE 9

 #define CV_CAP_PROP_BRIGHTNESS 10

 #define CV_CAP_PROP_CONTRAST 11

 #define CV_CAP_PROP_SATURATION 12

 #define CV_CAP_PROP_HUE 13

 #define CV_CAP_PROP_GAIN 14

 #define CV_CAP_PROP_EXPOSURE 15

 #define CV_CAP_PROP_CONVERT_RGB 16

 #define CV_CAP_PROP_WHITE_BALANCE 17

 #define CV_CAP_PROP_RECTIFICATION 18

 

通过创建一个Capture对象的指针后,调用cvGetCaptureProperty即可获取上述任何相关属性;但是我们不能太依赖这个函数;比如我们想获取一段视频的帧数,我们就不能太依赖于CV_CAP_PROP_FRAME_COUNT这个属性;因为cvGetCaptureProperty对属性的访问,其实访问的是关联视频文件的文件头信息,并不是真正去访问了视频的图像数据,这就带来一个问题:我们在讲其他视频格式转换为AVI格式的时候,图像帧数并没改变,只是视频文件头改变了,这时直接通过get函数读取的信息就可能不准确;最好的办法是迭代从视频中取出一帧,检查是否有数据,来确定该视频文件的总共帧数~~~ 不光是帧数,帧率也可能不对~~

 比如,自己在实验中庸狸窝转换器将一段视频转换为avi格式的视频文件后,用下面的两段代码,结果差距很大: 

code 1.

 

CvCapture *cap = cvCaptureFromFile(videoName);//获取视频

 int numFrames = (int) cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_COUNT);//得到视频帧数,笔者获得的结果为148

 

CODE 2.

 IplImage* pImg=NULL;

 int count=0;

 while((pImg=cvQueryFrame(cap))!=NULL)

 {

count++;

 }//得到的帧数只有60帧;

 

究其原因其实就是cvGetCaptureProperty实现的机制上,它只是读取视频文件头信息,而不是真正读取了视频文件;因此在进行不同格式的视频文件转换为OpenCV支持的AVI时,可能获取的属性并不准确~~~

 因此在使用该函数时,要注意。自己的经验是对于原始的AVI文件,可以直接使用该函数(code1),而经过转换而得到的视频文件,最好使用code 2。

 

 

cvSetCaptureProperty

设置视频获取属性   int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );   

capture 视频获取结构。   

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的四个字符(只对摄像头有效)value 属性的值。   

函数cvSetCaptureProperty设置指定视频获取的属性。目前这个函数对视频文件只支持:

CV_CAP_PROP_POS_MSEC

CV_CAP_PROP_POS_FRAMES

CV_CAP_PROP_POS_AVI_RATIO


2 0
原创粉丝点击