【问题标题】:Getting current FPS of OpenCV获取 OpenCV 的当前 FPS
【发布时间】:2014-02-20 21:23:31
【问题描述】:

我正在编写一个 OpenCV 应用程序,FPS 非常重要。如何计时主循环的处理时间以获得当前和平均 FPS? 这样,我就可以知道我的应用程序可以运行多快。顺便说一句,我使用的是 SSD 的 imread,所以处理器是这​​里的瓶颈!

【问题讨论】:

    标签: opencv frame-rate


    【解决方案1】:

    你可以做这样的事情。关于 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 时间,而不是 walltime。 (所以 io / sleeps 等不会出现在那里)
    • 在 Windows 上,我在进程中放置了一个 Sleep(1000)。并且输出符合预期(来自walltime)。在linux上,它使用不同的功能,因此也应该是正确的。
    • 该代码已经过许多网络摄像机的测试,并且还给出了在网络摄像机设置中设置的正确 fps。因此,出于所有实际目的,它将给出正确的 fps(墙上时间)。
    • 更多官方说法,clock()的行为与windows和linux不同。 msdn.microsoft.com/en-us/library/4e2ess30.aspx
    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 2010-11-13
    • 2015-06-28
    相关资源
    最近更新 更多