2014-02-20 2 views
4

저는 OpenCV 응용 프로그램을 작성 중이며 FPS는 매우 중요합니다. 현재 및 평균 FPS를 얻기 위해 메인 루프의 처리 시간을 어떻게 조정합니까? 이렇게하면 애플리케이션이 얼마나 빨리 작동하는지 알 수 있습니다. 그건 그렇고, 나는 SSD에서 imread를 사용하고있어 프로세서가 병목 현상을 일으킬 수 있습니다!OpenCV의 현재 FPS 받기

답변

4

이렇게 할 수 있습니다. 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; 
}  
+0

참고 :이 값은 walltime이 아니라 cpu 시간 만 측정합니다. (그래서 io/sleeps 등은 거기에 나타나지 않을 것입니다.) windows에 – berak

+0

, 나는 Sleep (1000) 프로세스를 넣었습니다. 출력은 예상대로입니다 (벽 시간부터). 리눅스에서는 다른 기능을 사용하기 때문에 올바른 것이어야합니다. –

+0

코드는 많은 ip 카메라로 테스트되었으며 ip 카메라 설정에서 올바른 fps를 제공합니다. 따라서 모든 실제적인 목적을 위해 정확한 fps (벽 시간)를 제공합니다. 더 많은 공식적인 인수를 얻으려면 –