4
저는 OpenCV 응용 프로그램을 작성 중이며 FPS는 매우 중요합니다. 현재 및 평균 FPS를 얻기 위해 메인 루프의 처리 시간을 어떻게 조정합니까? 이렇게하면 애플리케이션이 얼마나 빨리 작동하는지 알 수 있습니다. 그건 그렇고, 나는 SSD에서 imread를 사용하고있어 프로세서가 병목 현상을 일으킬 수 있습니다!OpenCV의 현재 FPS 받기
저는 OpenCV 응용 프로그램을 작성 중이며 FPS는 매우 중요합니다. 현재 및 평균 FPS를 얻기 위해 메인 루프의 처리 시간을 어떻게 조정합니까? 이렇게하면 애플리케이션이 얼마나 빨리 작동하는지 알 수 있습니다. 그건 그렇고, 나는 SSD에서 imread를 사용하고있어 프로세서가 병목 현상을 일으킬 수 있습니다!OpenCV의 현재 FPS 받기
이렇게 할 수 있습니다. 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;
}
참고 :이 값은 walltime이 아니라 cpu 시간 만 측정합니다. (그래서 io/sleeps 등은 거기에 나타나지 않을 것입니다.) windows에 – berak
, 나는 Sleep (1000) 프로세스를 넣었습니다. 출력은 예상대로입니다 (벽 시간부터). 리눅스에서는 다른 기능을 사용하기 때문에 올바른 것이어야합니다. –
코드는 많은 ip 카메라로 테스트되었으며 ip 카메라 설정에서 올바른 fps를 제공합니다. 따라서 모든 실제적인 목적을 위해 정확한 fps (벽 시간)를 제공합니다. 더 많은 공식적인 인수를 얻으려면 –