获取OpenCV当前帧率

6
我正在编写一个OpenCV应用程序,FPS非常重要。如何计时主循环的处理时间以获取当前和平均FPS?这样,我就可以知道我的应用程序运行速度有多快了。顺便说一下,我正在使用SSD读取图像,所以处理器是瓶颈!
1个回答

6

你可以像这样做。关于 FPS,我发现与其从平均持续时间派生出来,实际上在 1 秒段内进行计数并平均会略微更好。你可以通过更改 _avgfps=0.7*_avgfps+0.3*_fps1sec; 来控制平均值(或间隔窗口)的稳定性。例如,_avgfps=0.9*_avgfps+0.1*_fps1sec; 将使收敛速度变慢,但更能抵抗短期波动。比例必须准确地总和为 1。

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <opencv/cv.h>

#include <sys/timeb.h>
using namespace cv;


#if defined(_MSC_VER) || defined(WIN32)  || defined(_WIN32) || defined(__WIN32__) \
    || defined(WIN64)    || defined(_WIN64) || defined(__WIN64__) 
int CLOCK()
{
    return clock();
}
#endif

#if defined(unix)        || defined(__unix)      || defined(__unix__) \
    || defined(linux)       || defined(__linux)     || defined(__linux__) \
    || defined(sun)         || defined(__sun) \
    || defined(BSD)         || defined(__OpenBSD__) || defined(__NetBSD__) \
    || defined(__FreeBSD__) || defined __DragonFly__ \
    || defined(sgi)         || defined(__sgi) \
    || defined(__MACOSX__)  || defined(__APPLE__) \
    || defined(__CYGWIN__) 
int CLOCK()
{
    struct timespec t;
    clock_gettime(CLOCK_MONOTONIC,  &t);
    return (t.tv_sec * 1000)+(t.tv_nsec*1e-6);
}
#endif

double _avgdur=0;
int _fpsstart=0;
double _avgfps=0;
double _fps1sec=0;

double avgdur(double newdur)
{
    _avgdur=0.98*_avgdur+0.02*newdur;
    return _avgdur;
}

double avgfps()
{
    if(CLOCK()-_fpsstart>1000)      
    {
        _fpsstart=CLOCK();
        _avgfps=0.7*_avgfps+0.3*_fps1sec;
        _fps1sec=0;
    }

    _fps1sec++;
    return _avgfps;
}

void process(Mat& frame)
{
    imshow("frame",frame);
}

int main(int argc, char** argv)
{
    int frameno=0;
    cv::Mat frame;
    cv::VideoCapture cap(0);
    for(;;)
    {
        cap>>frame;

        clock_t start=CLOCK();

        if(frame.data)process(frame);

        double dur = CLOCK()-start;
        printf("avg time per frame %f ms. fps %f. frameno = %d\n",avgdur(dur),avgfps(),frameno++ );
        if(waitKey(1)==27)
            exit(0);
    }
    return 0;
}     

请注意,以下内容仅测量 CPU 时间,而非墙钟时间。(因此 I/O、睡眠等不会在其中显示) - berak
在Windows上,我在进程中放置了Sleep(1000)。输出结果与预期相同(从walltime计算)。在Linux上,它使用不同的函数,因此也应该是正确的。 - Zaw Lin
该代码已经与许多IP摄像机进行了测试,并且还提供了正确的FPS,这是在IP摄像机设置中设置的。因此,在所有实际目的下,它将提供正确的FPS(墙上时间)。 - Zaw Lin
对于更正式的参数,clock() 的行为与 Windows 和 Linux 不同。http://msdn.microsoft.com/en-us/library/4e2ess30.aspx - Zaw Lin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接