测量OpenCV FPS

MSO*_*MSO 8 c++ opencv

我正在寻找一种测量openCV FPS的正确方法.我找到了几种方法.但它们都不适合我.

我测试过的第一个使用time_t start和time_t end.一旦它返回一个转储函数作为fps x时间图(我真的无法想象fps图如何成为转储函数),我认为一个是错误的.

这是这个情节的形象.

FPS PLOT

我测试的第二个使用t =(double)cvGetTickCount()来测量fps.一旦它返回120 fps,这种方式是错误的,但是,对于30秒长度,以120 fps捕获的视频不应该花费超过1分钟来处理.所以这是衡量FPS的错误方法.

有人知道在openCV中测量FPS的另一种方法吗?

PS.我正试图在视频的每一帧中找到圆圈.视频帧尺寸为320x240像素.

更新2 我正在尝试测量FPS的代码.

for(;;){

    clock_t start=CLOCK();

    Mat frame, finalFrame;
    capture >> frame; 

    finalFrame = frame;

    cvtColor(frame, frame, CV_BGR2GRAY);

    GaussianBlur(frame, frame, Size(7,7), 1.5, 1.5);
    threshold(frame, frame, 20, 255, CV_THRESH_BINARY);

    dilate(frame, frame, Mat(), Point(-1, -1), 2, 1, 1);
    erode(frame, frame, Mat(), Point(-1, -1), 2, 1, 1);

    Canny(frame, frame, 20, 20*2, 3 );

    vector<Vec3f> circles;

    findContours(frame,_contours,_storage,CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE );

    vector<vector<Point> > contours_poly( _contours.size() );
    vector<Rect> boundRect( _contours.size() );
    vector<Point2f>center( _contours.size() );
    vector<float>radius( _contours.size() );


    int temp = 0;

    for( int i = 0; i < _contours.size(); i++ )
    { 
        if( _contours[i].size() > 100 )
        {
           approxPolyDP( Mat(_contours[i]), contours_poly[i], 3, true );
           boundRect[i] = boundingRect( Mat(_contours[i]) );
           minEnclosingCircle( (Mat)_contours[i], center[i], radius[i] );
           temp = i;
           break;
        }
    }



    double dur = CLOCK()-start;
        printf("avg time per frame %f ms. fps %f. frameno = %d\n",avgdur(dur),avgfps(),frameno++ );

    frameCounter++;

    if(frameCounter == 3600)
    break;

    if(waitKey(1000/120) >= 0) break;
}
Run Code Online (Sandbox Code Playgroud)

更新

使用Zaw Lin方法执行程序! 在此输入图像描述

Zaw*_*Lin 8

我已经发布了一种方法来实现这个目标@ 获取当前的OpenCV FPS.有必要做一些平均,否则fps会太疯狂.

编辑

我在进程中放入了一个Sleep(),它给出了正确的fps和持续时间(+/- 1ms).

#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__) 

#include <windows.h>
bool _qpcInited=false;
double PCFreq = 0.0;
__int64 CounterStart = 0;
void InitCounter()
{
    LARGE_INTEGER li;
    if(!QueryPerformanceFrequency(&li))
    {
        std::cout << "QueryPerformanceFrequency failed!\n";
    }
    PCFreq = double(li.QuadPart)/1000.0f;
    _qpcInited=true;
}
double CLOCK()
{
    if(!_qpcInited) InitCounter();
    LARGE_INTEGER li;
    QueryPerformanceCounter(&li);
    return double(li.QuadPart)/PCFreq;
}

#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__) 
double CLOCK()
{
    struct timespec t;
    clock_gettime(CLOCK_MONOTONIC,  &t);
    return (t.tv_sec * 1000)+(t.tv_nsec*1e-6);
}
#endif

double _avgdur=0;
double _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)
{
    Sleep(3);
}
int main(int argc, char** argv)
{
    int frameno=0;
    cv::Mat frame;
    cv::VideoCapture cap(0);
    for(;;)
    {
        //cap>>frame;
        double start=CLOCK();
        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;
}    
Run Code Online (Sandbox Code Playgroud)

  • 你之前怎么称呼`InitCounter();` (2认同)