Я пытаюсь рассчитать время, которое моя программа берет, чтобы обнаружить ключевые точки изображения. Если в моей программе c++ я делаю это два раза (с одним и тем же изображением), существует огромная разница между ними. Первый раз он использует около 600-800 мс, а во второй раз всего 100-200 мс.
Кто-нибудь знает, что происходит?
Вот код, где я получаю время:
struct timeval t1, t2;
Ptr<SURF> detector = SURF::create(400);
gettimeofday(&t1, 0x0);
detector->detect( imagen1, keypoints_1 );
gettimeofday(&t2, 0x0);
int milliSeconds = Utils::calculateDiff(t1, t2);
Вот код, где я вычисляю diff:
static int calculateDiff(timeval t1, timeval t2)
{
return (t2.tv_sec - t1.tv_sec) * 1000 + (t2.tv_usec - t1.tv_usec)/1000;
}
Вот пример:
обратите внимание, что gettimeofday использует wall-time, тогда как для таких задач обычно требуется cpu/clock-time.
для профилирования, попробуйте что-нибудь (еще более портативное), например:
int64 t0 = cv::getTickCount();
//
// some lengthy op.
//
int64 t1 = cv::getTickCount();
double secs = (t1-t0)/cv::getTickFrequency();
Test(1): t0-t1 (not in seconds) = 1444919
Test(2): t0-t1 (not in seconds) = 274456
вы можете использовать getTickCount() и getTickFrequency() для подсчета времени. однако при использовании этих функций возникает проблема усечения. После некоторых попыток этот код работал для меня:
long double execTime, prevCount, time;
execTime = prevCount = time = 0;
for (;;)
{
prevCount = getTickCount() * 1.0000;
/*do image processing*/
time += execTime;
cout << "execTime = " << execTime << "; time = " << time << endl;
execTime = (getTickCount()*1.0000 - prevCount) / (getTickFrequency() * 1.0000);
}
cv::Mat imagen2 = imagen1.clone();
для обнаружения потребуется100-200 ms
или600-800 ms
? Не уверен, что openCV запоминаетintegral images
вычисленные SURF-Detector, до тех пор, пока входное изображение не будет освобождено или что-то в этом роде ...