2017-11-08 1 views
0

C++의 이미지 처리 프로그램에서 여러 함수의 실행 시간을 측정하고 있습니다. 특히 USB 카메라로 프레임을 캡처하기위한 실제 실행 시간을 갖고 싶습니다.측정 된 fps가 이론적 인 것보다 높음

문제는 결과가 카메라 매개 변수와 일치하지 않는 것입니다. 카메라는 최대 30fps로 가정하고 프레임을 가져 오는 데 33ms 미만의 측정 시간을 자주 얻습니다. 내가 예상해야한다고 생각하는 가치입니다. 예를 들어, 12ms 간격을 많이 얻었고 실제로는 너무 적게 보입니다. 다른 유사한 전화의 끝에 get_wall_time의 끝에서 소비

#include <time.h> 
#include <sys/time.h> 

double get_wall_time(){ 
    struct timeval time; 
    if (gettimeofday(&time,NULL)){ 
     // Handle error 
     return 0; 
    } 
    return (double)time.tv_sec + (double)time.tv_usec * .000001; 
} 

int main(){ 
    while (true) { 
     double previoustime = get_wall_time(); 
     this->camera.readFrame(); 
     double currenttime = get_wall_time(); 
     std::cout << currenttime-previoustime << std::endl; 
     // Other stuff 
     // ... 
     // ... 
     usleep(3000); 
    } 
} 
+1

"5 분마다 버스가 있어야합니다.하지만 버스 정류장에 와서는 5 분 정도 기다려야 할 때가 있습니다. 버스가 도착하기까지 1 분에서 2 분 정도 지연됩니다." –

+0

'this- > camera.readFrame()'새로운 프레임을 가져올 때까지 차단 하시겠습니까? –

답변

2

@Revolver_Ocelot는 말했다, 당신이 측정하는 시간 : 여기

는 코드입니다. 코드를 수정하려면 다음을 수행하십시오.

double currenttime = get_wall_time();  
while (true) { 
    double previoustime = currenttime; 
    this->camera.readFrame(); 
    ... 
    currentime = get_wall_time(); 
} 

차이점을 발견 할 수 있습니까? 이 코드는 각 패스 사이의 간격을 측정합니다. 이것은 초당 프레임을 얻고 자하는 것입니다.

카메라를 읽을 수있는 속도는 새로운 프레임을 완료하는 속도와 같지 않습니다. 카메라는 30FPS로 녹화 할 수 있으며 15FPS 또는 90FPS로 읽을 수 있으므로 프레임 스트림을 서브 샘플링하거나 오버 샘플링 할 수 있습니다.

오버 샘플링 할 수있는 한도는 이미지를 읽고 저장하는 데 걸리는 시간의 1/시간입니다.

@Jacob Hull이 차단과 관련이있는 내용입니다. readFrame이 마지막 프레임을 읽는 경우 새 프레임이 될 때까지 차단되지 않으며 측정과 마찬가지로 결과를 얻을 수 있습니다.

+0

답변 해 주셔서 감사합니다. 현재 측정하고있는 것은 프레임을 올바르게 읽는 시간입니까? 초당 프레임 수를 말할 때, 나는 그것이 1 초 동안 프레임을 읽을 수있는 횟수라고 생각했습니다. 어쩌면 나는 fps의 개념을 정말로 이해하지 못했을 것입니다 ... 그렇습니다. 전체 처리가 12ms 이상이라는 것을 알고 있습니다. – Trabool

+0

30fps보다 빠른 속도로 카메라를 읽는다면 소프트웨어 및 하드웨어에 따라 동일한 이미지가 여러 번 나타날 것입니다. 프레임의 판독 값은 전체 프레임의 시간을 초과하지 않아야합니다. 카메라와 관련해서는 초당 1/초당 이미지를 전송하도록 설정됩니다. 그것과 동기화 되려면 사용중인 라이브러리에 대한 설명서를 참조해야하지만 가장 간단한 형식으로 이미지를 동일한 속도로 읽습니다. –

관련 문제