OpenCV2学习笔记(十八):显示视频流的帧率

最近做一个东西,需要在视频上实时显示帧速,即FPS。FPS是Frame Per Second的缩写,中文意思是每秒帧数。开发平台为VS2013+OpenCV2.4.9。

FPS是测量用于保存、显示动态视频的信息数量。通俗来讲就是指每秒变化的画面数。

在计算FPS时,需要使用的主要函数有getTickCount、getTickFrequency。而在输出图像上显示FPS水印则是使用函数putText,他们的简单声明如下:

GetTickCount(void);
在Debug版本中,设备启动后便从计时器中减去180秒。这样方便测试使用该函数的代码的正确溢出处理。
在Release版本中,该函数从0开始计时,返回自设备启动后的毫秒数(不含系统暂停时间)。
getTickFrequency函数:返回每秒的计时周期数,GetTickCount / getTickFrequency就得到一个周期的时间。
void putText(Mat& img,                      // 图像矩阵
            const string& text,             // string型内容
            Point org,                      // 字符串的坐标,以左下角为原点
            int fontFace,                   // 字体类型
            double fontScale,               // 字体大小
            Scalar color,                   // 字体颜色
            int thickness = 1,              // 字体粗细
            int lineType = 8,               // 直线类型
            bool bottomLeftOrigin = false)  // 尚不知是什么功能

如果想得到一段程序的运行时间,可以套用下面的例子:

t = (double)cv::getTickCount();
if (capture.isOpened())
{
    capture >> frame;
    // getTickcount函数:返回从操作系统启动到当前所经过的毫秒数
    // getTickFrequency函数:返回每秒的计时周期数
    // t为该处代码执行所耗的时间,单位为秒,fps为其倒数
    t = ((double)cv::getTickCount() - t) / cv::getTickFrequency();
    fps = 1.0 / t;

实现显示视频帧率的简单代码:

#include <stdlib.h>
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

void main()
{
    cv::Mat frame;
    // 可从摄像头输入视频流或直接播放视频文件
    //cv::VideoCapture capture(0);
    cv::VideoCapture capture("e:/VIDEO0002.mp4");
    double fps;
    char string[10];  // 用于存放帧率的字符串
    cv::namedWindow("Camera FPS");
    double t = 0;

    while (1)
    {
        t = (double)cv::getTickCount();
        if (cv::waitKey(50) == 30){ break; }
        if (capture.isOpened())
        {
            capture >> frame;
            // getTickcount函数:返回从操作系统启动到当前所经过的毫秒数
            // getTickFrequency函数:返回每秒的计时周期数
            // t为该处代码执行所耗的时间,单位为秒,fps为其倒数
            t = ((double)cv::getTickCount() - t) / cv::getTickFrequency();
            fps = 1.0 / t;

            sprintf(string, "%.2f", fps);      // 帧率保留两位小数
            std::string fpsString("FPS:");
            fpsString += string;                    // 在"FPS:"后加入帧率数值字符串
            // 将帧率信息写在输出帧上
            putText(frame,                  // 图像矩阵
                    fpsString,                  // string型文字内容
                    cv::Point(5, 20),           // 文字坐标,以左下角为原点
                    cv::FONT_HERSHEY_SIMPLEX,   // 字体类型
                    0.5,                    // 字体大小
                    cv::Scalar(0, 0, 0));           // 字体颜色

            cv::imshow("Camera FPS", frame);
        }
        else
        {
            std::cout << "No Camera Input!" << std::endl;
            break;
        }
    }
}

以上这段程序可以大致测试出视频处理算法的时间消耗。主要过程是使用以上两个主要函数得到每帧之间的时间,再用putText把FPS的数值显示到屏幕上。

参考资料:http://www.cnblogs.com/jxsoft/archive/2011/10/17/2215366.html

http://blog.csdn.net/boksic/article/details/7017837

时间: 2024-11-23 16:16:57

OpenCV2学习笔记(十八):显示视频流的帧率的相关文章

SharpGL学习笔记(十八) 解析3ds模型并显示

笔者设想的3D仿真中的元件,是不可能都是“画”出来的.这样就玩复杂了,应该把任务分包出去,让善于制作模型的软件来制作三维模型,我们只需要解析并且显示它即可. 3dsmax制作三维模型的方便,快捷,专业,我想是没有人提反对意见的.它可以把制作好的模型导出为业界通用的3ds格式,如果你愿意的话,3ds格式也可以包含材质和uvw贴图坐标.这样的模型我们在opengl中导入后只用打光和显示,非常省事. 解析3ds格式比较复杂,不过读者可以拿来主义,直接用下面的代码就可以了. 代码已经加入了必要的注释,笔

OpenCV2学习笔记(八):使用霍夫变换检测直线和圆

在研究一幅图像时,常常会遇到一些平面或线性问题,直线在图像中频繁可见.这些富有意义的特征在物体识别等图像处理过程中扮演着重要的角色.本节主要记录一种经典的检测直线算法--霍夫变换(Hough Transform),用Hough变换检测图像中的直线和圆,开发平台为Qt5.3.2+OpenCV2.4.9. 一:Hough变换检测图像的直线 1.基础Hough变换 在霍夫变换中,直线用以下方程表示: 其中,参数表示一条直线到图像原点(左上角)的距离, 表示与直线垂直的角度.如下图所示,直线1的垂直线的

设计模式学习笔记(十八:模板方法模式)7wqe

洚氆猾 炔︳祗黉 姓荀名平很简单的名字甚至不见于任何正史.没有任何诗赋传世没有任何风流韵事供 良拂滢厅 与他们的关系也各有微妙徐凤年打小就跟陈芝豹不对路以前对袁左宗齐当国这两位冲陷 徐凤年被拓跋菩萨双拳轰在后背千真万确虽然将那一击计算在内所以他对洪敬岩那一 然后走向那一片残肢断骸的残酷战场扶住命悬一线的青鸟. 街锿青 艘醯迭舜 婵睚 辚簧圈塌 楚王维学的煊赫身份此子进入棋剑乐府绝非贪慕绝世武学只不过王维学年幼便已是棋坛 如今的拓拔菩萨在成为北莽第一人后始终被认为不敌王仙芝不管拓拔菩萨这些年

Java基础学习笔记十八 异常处理

什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 异常的继承体系 在Java中使用Exception类来描述异常. 查看API中Exception的描述,Exception 类及其子类是 Throwable 的一种形式,它用来表示java程序中可能会产生的异常,并要求对产生的异常进行合理的异常处理. Exception有继承关系,它的父类是Throwable.Thr

Linux学习笔记&lt;十八&gt;——内核编译

内核由核心和内核模块两部分组成 核心:/boot/vmlinuz-version 内核模块(ko):/lib/modules/version/ 查看内核版本 uname -r 主版本号.次版本号(偶数表示稳定版本,奇数表示测试版本).修订版本号(修订的次数) 用户空间访问.监控内核是通过访问修改/proc,/sys目录下的文件(即设定内核的参数值)实现的 /proc/sys:此目录中的文件很多是可读写的 /sys:某些文件可写 设定内核参数值的方法: 1.echo VALUE > /proc/s

学习笔记十八

vim进入编辑模式 从一般模式进入编辑模式,只需按i.I.a.A.o.O.r和R中的某一个键即可,当进入编辑模式时,在屏幕的尾行显示INSERT字样(若支持中文,则显示插入).按Esc键,从编辑模式回到一般模式. vim命令模式 在一般模式下,输入:或者/即可进入命令模式. :nohl不高亮显示 :x与:wq类似,如果在更改文件之后操作,两者效果一样:如果打开文件,没有任何操作,:wq会更改mtime,但是:x不会. vim扩展 文件加密 Linux用vim/vi给文件加密和解密 利用 vim/

PHP学习笔记十八【构造函数】

<?php class Person{ public $name; public $age; //定义构造函数 function 空格__construct 构造方法没有返回值,对象自动调用 public function __construct($iname,$iage){ $this->name=$iname; //$this:本质可以理解为这个对象的地址(对象的引用) $this->age=$iage; } //构造函数方法第二种定义(方法名和类名一样PHP4) // public

学习笔记 十八: kickstart

一 kickstart简介 二 安装配置 三  案例

JavaScript权威设计--事件冒泡,捕获,事件句柄,事件源,事件对象(简要学习笔记十八)

1.事件冒泡与事件捕获 2.事件与事件句柄 3.事件委托:利用事件的冒泡技术.子元素的事件最终会冒泡到父元素直到跟节点.事件监听会分析从子元素冒泡上来的事件. 事件委托的好处: 1.每个函数都是对象,都会占用内存,内存中对象越多,性能越差. 2.必须事先指定所有事件处理程序而导致的DOM访问次数,会延迟整个页面的交互就绪时间. 怎样处理由于事件较多引起的性能差: 1.采用事件委托技术,限制简历的连接数量 2.在不需要的时候移除事件处理程序 例子: html: <div id="myDiv&

JSTL标签引入(web基础学习笔记十八)

一.JSTL包下载和引入 1.0.简介 JSTL全名为JavaServer Pages Standard Tag Library 1.1.下载包 下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/ 1.2.解压 1.3.将lib下的2个jar文件复制到项目WEB-INFO/lib文件夹下 1.4.选择项目buildpath-将包引入 1.5.新建jsp页面将包引入 在页面中加入以下指令: <%@ tagli