OpenCV рассчитать время обнаружения функции

0

Я пытаюсь рассчитать время, которое моя программа берет, чтобы обнаружить ключевые точки изображения. Если в моей программе 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;
}

Вот пример:

Образец

  • 0
    если вы создаете второе изображение с идентичной информацией о пикселях: cv::Mat imagen2 = imagen1.clone(); для обнаружения потребуется 100-200 ms или 600-800 ms ? Не уверен, что openCV запоминает integral images вычисленные SURF-Detector, до тех пор, пока входное изображение не будет освобождено или что-то в этом роде ...
  • 0
    Требуется 100-200 мс. Мои шаги: 1. Клонировать изображение 2. Определить элементы по первому изображению (600-800 мс) 3. Определить функции по копии (100-200 мс)
Показать ещё 5 комментариев
Теги:
opencv
feature-detection
surf

2 ответа

2

обратите внимание, что gettimeofday использует wall-time, тогда как для таких задач обычно требуется cpu/clock-time.

для профилирования, попробуйте что-нибудь (еще более портативное), например:

int64 t0 = cv::getTickCount();
//
// some lengthy op.
//
int64 t1 = cv::getTickCount();
double secs = (t1-t0)/cv::getTickFrequency();
  • 1
    Тот же результат с идентичными изображениями. Test(1): t0-t1 (not in seconds) = 1444919 Test(2): t0-t1 (not in seconds) = 274456
  • 0
    @berak У вас не было ловкого трюка для профилирования разделов кода? Я помню как какой-то ответ на другой вопрос по SO.
Показать ещё 2 комментария
1

вы можете использовать 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);
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню