获取OpenCV的当前FPS

获取OpenCV的当前FPS,opencv,frame-rate,Opencv,Frame Rate,我正在编写一个OpenCV应用程序,FPS非常重要。如何计算主循环的处理时间以获得当前和平均FPS? 这样,我就可以知道我的应用程序的运行速度。顺便说一句,我使用的是从SSD读取的imread,所以处理器是这里的瓶颈 你可以这样做。关于fps,我发现与其从平均持续时间中推导,不如实际计算1秒段和平均值。您可以通过更改\u avgfps=0.7*\u avgfps+0.3*\u fps1sec来控制平均值(或间隔窗口)的稳定性。例如\u avgfps=0.9*\u avgfps+0.1*\u fp

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

你可以这样做。关于fps,我发现与其从平均持续时间中推导,不如实际计算1秒段和平均值。您可以通过更改
\u avgfps=0.7*\u avgfps+0.3*\u fps1sec来控制平均值(或间隔窗口)的稳定性。例如
\u avgfps=0.9*\u avgfps+0.1*\u 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;
}     
#包括“opencv2/highgui/highgui.hpp”
#包括“opencv2/imgproc/imgproc.hpp”
#包括
#包括
使用名称空间cv;
#如果已定义(_MSC_VER)|已定义(WIN32)|已定义(_WIN32)|已定义(_WIN32|)\
||已定义(WIN64)| |已定义(_WIN64)| |已定义(uu WIN64_uuu)
整数时钟()
{
返回时钟();
}
#恩迪夫
#如果已定义(unix)| |已定义(unix)| |已定义(unix)\
||已定义(linux)| |已定义(linux)| |已定义(linux)\
||已定义(太阳)| |已定义(太阳)\
||已定义(BSD)| |已定义(u OpenBSD_uuuuuuu)| |已定义(u NetBSD_uuuuuuuuu)\
||已定义(uuu FreeBSD_uuuuuuuuu)|已定义uuu蜻蜓uuu\
||已定义(sgi)| |已定义(u sgi)\
||已定义的(uuMacosx_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu\
||已定义(uuu CYGWIN_uuuu)
整数时钟()
{
结构timespect;
时钟获取时间(时钟单调,&t);
返回(t.tv_sec*1000)+(t.tv_nsec*1e-6);
}
#恩迪夫
double _avgdur=0;
int _fpstart=0;
双_avgfps=0;
双_fps1sec=0;
双avgdur(双新DUR)
{
_avgdur=0.98*_avgdur+0.02*newdur;
返回_avgdur;
}
双avgfps()
{
如果(时钟()
{
_fpstart=时钟();
_平均GFPS=0.7*_平均GFPS+0.3*_fps1秒;
_fps1sec=0;
}
_fps1sec++;
返回平均GFPS;
}
脱空工艺(垫和框架)
{
imshow(“框架”,框架);
}
int main(int argc,字符**argv)
{
int frameno=0;
cv::垫架;
cv::视频捕获上限(0);
对于(;;)
{
cap>>框架;
时钟启动=时钟();
if(帧数据)处理(帧);
双dur=时钟()-启动;
printf(“每帧平均时间%f ms.fps%f.frameno=%d\n”,avgdur(dur),avgfps(),frameno++);
如果(等待键(1)=27)
出口(0);
}
返回0;
}     

请注意,这只是测量cpu时间,而不是墙时间。(所以io/sleeps之类的东西不会出现在那里)在windows上,我在进程中设置了一个Sleep(1000)。输出与预期一致(来自walltime)。在linux上,它使用了不同的功能,因此也应该是正确的。该代码已在许多ip摄像头上进行了测试,并给出了正确的fps,该fps在ip摄像头设置中设置。因此,对于所有实际用途,它将给出正确的fps(墙时间)。对于更正式的说法,其行为是
clock()
不同于windows和linux。