OpenCV视频播放控制

OpenCV chm 文档下载http://download.csdn.net/detail/u010944555/5718997

#include "highgui.h"
#include "cv.h"

int frame_count = 0; //用于随视频播放更新滚动条的位置
int g_slider_position = 0;//初始时滚动条的位置
CvCapture* capture = NULL; //读取视频后在CvCapture内存放的指针

void onTrackbarSlide(int pos)//在cvGetCaptureProperty内要调用的回调函数 在滚动条的位置发生改变时调用
{
	cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, pos);//设置视频帧的读取位置
	frame_count = pos;
}
int main( int argc ,char ** argv)
{
	capture = cvCreateFileCapture ("Backkom.avi");  //读取视频

	if(capture==NULL) 
	{
		printf("NO capture");    //读取不成功,则标识
		return 1;
	};    

	float fps=cvGetCaptureProperty(capture, CV_CAP_PROP_FPS );   //读取视频的帧率
	float vfps = 1000 / fps;                                        //计算每帧播放的时间
	printf("%5.1f\t%5d\n",fps,vfps);                             
	float frames=cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_COUNT);//读取视频中有多少帧
	printf("frames is %f\n",frames);
	cvNamedWindow("example",CV_WINDOW_AUTOSIZE);                  //定义窗口 显示每帧图像

	if( frames!= 0)
	{
		//在名为example的窗口上设置滚动条,滚动条名为Position, onTrackbarSlide 为之前定义的回调函数
		cvCreateTrackbar("Position", "example", &g_slider_position, frames, onTrackbarSlide);
		printf("Create trackbar successfully!");
	}

	IplImage * frame;//定义图像指针
	while(1)
	{ 
		frame = cvQueryFrame( capture );                          //抓取帧
		float ratio = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO);     //读取该帧在视频中的相对位置
		//printf("%f\n",ratio);
		if(!frame)break;
		cvShowImage("example",frame);                          //显示
		char c = cvWaitKey(vfps);//等待vfps毫秒并获取按键 没有按键则返回-1
		if(c == 27 )//Esc键值为27 
			break;
		//随视频播放 更新滚动条位置
		cvSetTrackbarPos("Position","example", frame_count);
		frame_count++;
	}
	//释放
	cvReleaseCapture(&capture);
	cvDestroyWindow("example");
	return(0);
}

cvCreateTrackbar
创建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显示在指定窗口的顶端。

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

cvCreateFileCapture
初始化从文件中获取视频

CvCapture* cvCreateFileCapture( const char* filename );
filename
视频文件名。
函数cvCreateFileCapture给指定文件中的视频流分配和初始化CvCapture结构。

当分配的结构不再使用的时候,它应该使用cvReleaseCapture函数释放掉。

cvQueryFrame
从摄像头或者文件中抓取并返回一帧

IplImage* cvQueryFrame( CvCapture* capture );
capture
视频获取结构。
函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。这个函数仅仅是函数cvGrabFrame和函数cvRetrieveFrame在一起调用的组合。返回的图像不可以被用户释放或者修改。




你可能感兴趣的:(OpenCV视频播放控制)