OpenCV下按视频帧率(FPS)播放视频

上传人:碎****木 文档编号:220861418 上传时间:2021-12-09 格式:DOCX 页数:4 大小:16.75KB
返回 下载 相关 举报
OpenCV下按视频帧率(FPS)播放视频_第1页
第1页 / 共4页
OpenCV下按视频帧率(FPS)播放视频_第2页
第2页 / 共4页
OpenCV下按视频帧率(FPS)播放视频_第3页
第3页 / 共4页
亲,该文档总共4页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《OpenCV下按视频帧率(FPS)播放视频》由会员分享,可在线阅读,更多相关《OpenCV下按视频帧率(FPS)播放视频(4页珍藏版)》请在金锄头文库上搜索。

1、OpenCV 下按视频帧率FPS播放视频杨青锦大连 116023摘要:本文阐述了如何在 OpenCV 下按视频帧率FPS播放视频。程序使用了 Windows 系统下的高精度计时器把握视频播放的帧间隔时间。本文给出了高精度计时器的使用方法、实现时间把握功能的主要程序片段,并在文章的最终比较了高精度计时器与一般计时函数的 精度。关键词:OpenCV, 帧率,高精度计时器,播放视频How to play video at its original fps in OpenCVYang QingjinDalian 116023【Abstract】This article depicts how to p

2、lay video at its original fps in OpenCV. The program uses high-resolution timerof Windows system to play video at a certain frame interval. This article demonstrates the usage of high-resolution timer and the code segment implementing time control. In the end, this article compares the resolution be

3、tween high-resolution timer and common timer function.【Key words】OpenCV, fps, high-resolution timer, play videoOpenCV 是 Intel 公司资助的开源计算机视觉库。它供给了几百个 C/C+函数,实现了计算机视觉领域中大局部最常用的算法。使用 OpenCV 开发计算机视觉应用程序,经常要读取从摄像机获得的视频流或视频文件,获得其中的每一帧,再对该帧进展算法处理。假设要满足程序交互性的需要,通常还要将算法处理过的帧按原视频帧率FPS, frame per second显示出来。Ope

4、nCV 供给了视频帧的读取、显示函数以及获得视频帧率属性的函数,而按帧率打算的帧时间间隔显示帧,那么需要自己编程来解决。在程序中,首先要取得视频的帧率属性,并由此计算出帧间隔时间,代码如下:CvCapture * pCapture = cvCreateFileCapture(“Filename.avi“); double dFPS = cvGetCaptureProperty(pCapture, CV_CAP_PROP_FPS);DWORD dwFrameInterval = (DWORD) (1000 / dFPS);/帧间隔时间,以毫秒为单位CvCapture* cvCreateFileC

5、apture( const char* filename )的参数是要读取的文件名,函数返回指向CvCapture 构造体的指针,该指针的作用类似于我们用 fopen()函数翻开文件,返回的指向 FILE 构造体的指针, 之后我们可以通过这个指针操作视频文件。 假设程序是从摄像机读取视频, 那么用cvCreateCameraCapture代替该函数。double cvGetCaptureProperty( CvCapture* capture, int property_id )的作用是得到视频的属性信息,参数 CV_CAP_PROP_FPS 要求函数返回帧率。用 1000 除以帧率,就得到了

6、以毫秒为单位的帧间隔时间。通常一个处理视频的 OpenCV 程序主循环如下所示:for(;) /处理视频的循环作者简介:杨青锦、1982、男、硕士、物流系统中的计算机视觉应用;E-mail:yangqingjinhotmail /读取帧pFrame = cvQueryFrame(pCapture);/视频完毕,退出循环体if(!pFrame)break;/对每帧进展算法处理/显示帧cvShowImage(“Video“, pFrame);/延时 40 毫秒cvWaitKey(40);IplImage* cvQueryFrame( CvCapture* capture ) 的功能是挨次读取视频的

7、一帧,假设视频完毕,那么返回的指针为 NULL。程序接下来将对帧进展算法处理。在处理完毕后, cvShowImage()将帧显示在名为Video 的窗口中。cvWaitKey(40)的作用是延时 40 毫秒。假设我们对每一帧不做任何算法处理,那么该循环体的功能,就是将该视频以 40 毫秒的帧间隔即 25 fps)播放出来。然而在实际应用中,算法处理局部总会占用不定量的时间,所以延时固定时长的做法是不成立的。要使循环体的执行时间,即每一帧的处理时间,保持在帧率打算的帧间隔时间上,需要在循环体得首尾参加时间检测代码,即在开头猎取开头时间, 在末尾猎取完毕时间,两个时间的差值就是循环体执行时间。假设

8、循环体执行时间小于帧间隔时间,那么延时以确保循环体执行时间满足应有的帧间隔时间。在Windows操 作 系 统 下 , 我 们 用API函 数QueryPerformanceFrequency() 和QueryPerformanceCounter()进展时间检测。这两个函数的声明如下: BOOL WINAPI QueryPerformanceFrequency( outLARGE_INTEGER *lpFrequency);BOOL WINAPI QueryPerformanceCounter( outLARGE_INTEGER *lpPerformanceCount);QueryPerfor

9、manceFrequency() 的输出值 lpFrequency 指向系统内高精度性能计数器的频率, QueryPerformanceCounter()的输出值 lpPerformanceCount 指向调用时刻高精度性能计数器的计数。在 使 用 时 , 两 次 调 用QueryPerformanceCounter() , 所 得 结 果 的 差 值 , 除 以QueryPerformanceFrequency() 得 到 的 频 率 , 就 得 到 两 次 调 用 的 间 隔 时 间 。 举 例 来 说 , 如QueryPerformanceFrequency()得到的高精度性能计数器的频

10、率是每秒50000 次,先后两次调用QueryPerformanceCounter() 得到的值分别是 1500 和 3500 , 那么两次调用的时间间隔为(3500-1500)/50000=0.04 秒。上述两个函数的参数都是 LARGE_INTEGER* 类型,LARGE_INTEGER 的定义如下:typedef union _LARGE_INTEGER struct DWORD LowPart;LONG HighPart; DUMMYSTRUCTNAME;struct DWORD LowPart;LONG HighPart; u;LONGLONG QuadPart; LARGE_INT

11、EGER;由上可见,LARGE_INTEGER 代表了一个 64 位的整数,在一般程序中,我们只需要使用其低32 位,即DWORD LowPart。实现时间把握功能的完整程序片段如下所示:/猎取视频帧率,并计算出帧间隔时间CvCapture * pCapture = cvCreateFileCapture(“Filename.avi “);double dFPS = cvGetCaptureProperty(pCapture, CV_CAP_PROP_FPS);DWORD dwFrameInterval = (DWORD) (1000 / dFPS);/帧间隔时间,以毫秒为单位/猎取高精度性能

12、计数器的频率LARGE_INTEGER lint;QueryPerformanceFrequency( &lint );DWORD dwFrequency = (DWORD)( lint.LowPart );IplImage * pFrame;cvNamedWindow(“Video“); /创立名为 Video 的窗口for(;) /处理视频的循环QueryPerformanceCounter( &lint ); DWORD dwStartCount = lint.LowPart;/读取帧pFrame = cvQueryFrame(pCapture);/视频完毕,退出循环体if(!pFram

13、e)break;/对每帧进展算法处理/显示帧cvShowImage(“Video“, pFrame);/延时doQueryPerformanceCounter( &lint );while( (lint.LowPart - dwStartCount) * 1000 / dwFrequency) dwFrameInterval );在一般的对实时性要求不高的程序中,常使用 Windows API 函数 GetTickCount()猎取时间间隔。MSDN 关于 GetTickCount()的时间精度说明在 10-16 毫秒之间,这对于一般应用程序中的耗时计算是足够的, 但对于帧时 间间隔在毫秒级的

14、视频播放来说,就显得精度缺乏了。 MSDN 推举了 高精度 计时器QueryPerformanceFrequency()和 QueryPerformanceCounter()用于更高精度的计时,虽然 MSDN 没有明确说明高精度计时器的所能到达的精度,因其精度取决于计算机处理器,但在笔者的实际应用中,高精度性能计数器完全可以满足视频播放的毫秒级精度。最终补充一点,假设处理视频的循环体执行时间大于原视频的帧间隔时间,造成视频不能按原帧率播放, 那么需要优化每帧的处理算法,使每帧的处理时间保持在限度之内,满足实时性的需求。参考文献1刘瑞祯 于仕琪. OpenCV 教程 根底篇. 北京 北京航空航天高校出版社, 2007. 2Intel OpenCV1.0 安装包自带挂念文档. :/ 2007. 3Microsoft MSDN. :/msdn.microsoft /. 4/10/2021.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 教育/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号