OpenCV4学习笔记(2):显示相机视频流的帧率
1、基础知识:
FPS是测量用于保存、显示动态视频的信息数量。通俗来讲就是指每秒变化的画面数。
在计算FPS时,需要使用的主要函数有getTickCount、getTickFrequency。而在输出图像上显示FPS水印则是使用函数putText,他们的简单介绍如下:
getTickCount函数
它返回从操作系统启动到当前所经的计时周期数。
getTickFrequency函数:
返回每秒的计时周期数。
则计算一帧用时多少秒方法:
t=(double)getTickCount() capture>>frame;
t=((double)getTickCount()-t) / getTickFrequency()//就得到经过一帧用多少秒。
则 FPS=1.0/t;//1秒除以t, 就得到一秒变换多少帧即,帧率
以下是putText()函数各项参数介绍:
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) // 不知道是什么功能
2、理论完备,以下是实现求帧率的测试程序:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
Mat frame;
VideoCapture capture;
capture.open(1);
while (true)
{
double t = (double)getTickCount();//获得当前系统的计时间周期数
if (!capture.isOpened())break;
capture >> frame;//输入帧
t = ((double)getTickCount() - t) / getTickFrequency();//求输入帧后经过的周期数/每秒系统计的周期数=一帧用时多少秒
double fps = 1.0 / t;//求倒数得到每秒经过多少帧,即帧率
string s = "FPS:";
s += to_string(fps);//得到字符串FPS:XXX
putText(frame, s, Point(5, 20), FONT_HERSHEY_COMPLEX, 0.5, Scalar(0, 0, 0));//输入到帧frame上
imshow("Camera", frame);
if (waitKey(1) == 27)break;
}
capture.release();
return 0;
}
以上这段程序可以大致测试出相机的帧率,通过类似(time.end-time-start)/每秒周期数,算出一帧多少秒,再求倒数。得到帧率,并用putText显示到屏幕上。
程序调用相机运行结果如下:
以上代码我个人全部通过实验验证过的,如果有什么不对的地方,欢迎大家评论区指出。