opencv 视频播放

来源:互联网 发布:720全景源码 编辑:程序博客网 时间:2024/05/21 11:23
[cpp] view plain copy
  1. //播放AVI视频  
[cpp] view plain copy
  1. #include <highgui.h>  
[cpp] view plain copy
  1. #include <cv.h>  
[cpp] view plain copy
  1. void playavi(void)  
  2. {  
  3.     cvNamedWindow("Example2", CV_WINDOW_AUTOSIZE);  
  4.     CvCapture *capture=cvCreateFileCapture("光环:夜幕.BD.720p.中英双字幕.rmvb");  
  5.     IplImage *frame;  
  6.     while (1)  
  7.     {  
  8.         frame = cvQueryFrame(capture);  
  9.         if (!frame)  
  10.             break;  
  11.         cvShowImage("Example2", frame);  
  12.         char c=cvWaitKey(33);  
  13.         if (c == 27)  
  14.             break;  
  15.     }  
  16.     cvReleaseCapture(&capture);  
  17.     cvDestroyWindow("Example2");  
  18. }  




##################################################

加滚动条

[cpp] view plain copy
  1. #include <cv.h>  
[cpp] view plain copy
  1. #include <highgui.h>  
[cpp] view plain copy
  1. int g_slider_position = 0;  
  2. CvCapture *g_capture = NULL;  
  3.   
  4. void onTrackbarSlide(int pos){  
  5.     cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, pos);  
  6. }  
  7.   
  8. //拖动滚动条,函数onTrackSlide()便被调用并被传入滚动条新的状态值  
  9. void playavi_trackbar(void)  
  10. {  
  11.     cvNamedWindow("Example3", CV_WINDOW_AUTOSIZE);  
  12.     g_capture = cvCreateFileCapture("光环:夜幕.BD.720p.中英双字幕.rmvb");  
  13.     int frames = (int) cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT);  
  14.     if (frames != 0){  
  15.         cvCreateTrackbar("Position""Example3", &g_slider_position, frames, onTrackbarSlide);  
  16.     }  
  17.     IplImage *frame;  
  18.     while (1)  
  19.     {  
  20.         frame = cvQueryFrame(g_capture);  
  21.         if (!frame)  
  22.             break;  
  23.         cvShowImage("Example3", frame);  
  24.         char c=cvWaitKey(33);  
  25.         if (c == 27)  
  26.             break;  
  27.     }  
  28.     cvReleaseCapture(&g_capture);  
  29.     cvDestroyWindow("Example3");  
  30. }  




##############################################


CvCapture 结构体

CvCapture是一个结构体,用来保存图像捕获的信息,最大的作用就是处理视频时(程序是按一帧一帧读取),让程序读下一帧的位置,CvCapture结构中,每获取一帧后,所有信息都将被更新,获取下一帧回复。


cvCreateFileCapture(const char* mov)

通过参数设置确定要读入的avi文件,返回一个指向CvCapture结构的指针。这个结构包括了所有关于要读入avi文件的信息,其中包含状态信息。调用这个函数之后,返回指针所指向的CvCapture结构被初始化到对应的avi文件的开头


IplImage* cvQueryFrame( CvCapture* capture )

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

capture

视频获取结构。

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

cvQueryFrame的参数为CvCapture结构的指针。用来将下一帧视频文件载入内存,返回一个对应当前帧的指针。与cvLoadImage不同的是cvLoadImage为图像分配内存空间,而cvQueryFrame使用已经在cvCapture结构中分配好的内存。这样的话,就没有必要通过cvReleaseImage()对这个返回的图像指针进行释放,当CvCapture结构被释放后,每一帧图像所对应的内存空间即会被释放。


void cvReleaseCapture(CvCapture **capture)

释放capture结构

函数cvReleaseCapture释放由函数cvCreateFileCapture或者cvCreateCameraCapture分配的CvCapture结构。
注:若从capture中使用cvQueryFrame获取图像指针,在releaseCapture的时候同时函数释放图像指针,用户不用再自己释放。


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


double cvGetCaptureProperty(CvCapture* capture,int property_id)

获取视频文件的一些属性

capture  视频获取结构;

property_id  属性标识。
以下是OpenCV属性的一些宏定义:
CV_CAP_PROP_POS_MSEC //影片目前位置,为毫秒数或者视频获取时间戳
CV_CAP_PROP_POS_FRAMES //将被下一步解压/获取的帧索引,以0为起点
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的四个字符
CV_CAP_PROP_FRAME_COUNT  // 视频文件中帧的总数
CV_CAP_PROP_FORMAT       
CV_CAP_PROP_MODE          
CV_CAP_PROP_BRIGHTNESS    
CV_CAP_PROP_CONTRAST      
CV_CAP_PROP_SATURATION    
CV_CAP_PROP_HUE          
CV_CAP_PROP_GAIN         
CV_CAP_PROP_EXPOSURE     
CV_CAP_PROP_CONVERT_RGB   
CV_CAP_PROP_WHITE_BALANCE 
CV_CAP_PROP_RECTIFICATION 
通过创建一个Capture对象的指针后,调用cvGetCaptureProperty即可获取上述任何相关属性;但是我们不能太依赖这个函数;比如我们想获取一段视频的帧数,我们就不能太依赖于CV_CAP_PROP_FRAME_COUNT这个属性;因为cvGetCaptureProperty对属性的访问,其实访问的是关联视频文件的文件头信息,并不是真正去访问了视频的图像数据,这就带来一个问题:我们在讲其他视频格式转换为AVI格式的时候,图像帧数并没改变,只是视频文件头改变了,这时直接通过get函数读取的信息就可能不准确;最好的办法是迭代从视频中取出一帧,检查是否有数据,来确定该视频文件的总共帧数~~~
例如:
示例1:
CvCapture* cap = cvCaptureFromFile(videoName);//获取视频
int numFrames = (int) cvGetCaptureProperty(cap,CV_CAP_PROP_FRAME_COUNT);//得到视频帧数,
//得到的帧数是148帧
示例2:[较好的方法]
IplImage* pImg = NULL;
int count = 0;
while((pImg = cvQueryFrame(cap))!=NULL){
count++;
}//得到的帧数只有60帧


定义:
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的显示位置

0 0