влияет ли время захвата на imwrite opencv? - PullRequest
0 голосов
/ 18 мая 2018

Я использую C ++ и opencv для захвата изображений с камеры.В рамках этого процесса, как показано ниже в моем коде, я также измеряю продолжительность захвата в миллисекундах, используя gettimeofday() до и после захвата изображения.

Mat IMG; 
unsigned long ms;
VideoCapture cap(0);
struct timeval tp1,tp2;
while(1)
{
   gettimeofday(&tp1,NULL);
   cap>>IMG;
   gettimeofday(&tp2,NULL);
   ms=10000000*(tp1.tv_sec-tp2.tv_sec)+(tp1.tv_usec-tp2.tv_usec);
   cout<<ms/1000<<endl;
}

Я знаю, что моя камера может развивать скорость до 60 кадров в секунду.Поэтому этот код будет выводить значения 15 ~ 17 мс.Теперь я хочу сохранить свои изображения, поэтому я использую для этого функцию imwrite() и добавляю ее после второго вызова gettimeofday(), как показано ниже:

Mat IMG; 
unsigned long ms;
VideoCapture cap(0);
int cc=0;
struct timeval tp1,tp2;
while(1)
{
   gettimeofday(&tp1,NULL);
   cap>>IMG;
   gettimeofday(&tp2,NULL);
   ms=10000000*(tp1.tv_sec-tp2.tv_sec)+(tp1.tv_usec-tp2.tv_usec);
   cc=cc+1;
   imwrite("IMG_"+std::to_string(cc)+".png",IMG);
   cout<<ms/1000<<endl;
}

Теперь в этом случае вывод будет5 ~ 6 мс!и если я сделаю второй вызов gettimeofday() после записи изображения, я получу те же значения 15 ~ 17 мс.Как это возможно?Заранее спасибо.

1 Ответ

0 голосов
/ 18 мая 2018

Это происходит потому, что вы измеряете только время ожидания на VideoCapture.

. В первом примере извлечение следующего кадра всегда будет блокироваться до тех пор, пока оно не будет готово (и будет проводить только время), то естьвы увидите значения, обратные вашей частоте кадров.

Во втором примере чтение первого кадра должно занимать столько же времени.Однако затем вы тратите время на запись изображения в файл.В то время как это происходит, камера начнет записывать следующий кадр - это означает, что когда вы в следующий раз попросите дать вам изображение, часть времени, необходимая для этого, уже истечет, поэтому ваш период ожидания будет короче.

...