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

Я пытаюсь рассчитать время, которое требуется моей программе для обнаружения ключевых точек на изображении. Если в моей программе на С++ я делаю это два раза (с одним и тем же изображением), между ними будет огромная разница. В первый раз он использует около 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);

Вот код, в котором я вычисляю разницу:

static int calculateDiff(timeval t1, timeval t2)
{
    return (t2.tv_sec - t1.tv_sec) * 1000 + (t2.tv_usec - t1.tv_usec)/1000;
}

Вот пример:

Пример


person DavidGSola    schedule 20.11.2014    source источник
comment
если вы создадите второе изображение с идентичной информацией о пикселях: cv::Mat imagen2 = imagen1.clone(); потребуется ли 100-200 ms или 600-800 ms для обнаружения? Не уверен, запоминает ли openCV integral images, вычисленный SURF-Detector, до тех пор, пока входное изображение не будет освобождено или что-то в этом роде...   -  person Micka    schedule 20.11.2014
comment
Требуется 100-200 мс. Мои шаги: 1. Клонировать изображение 2. Обнаружить признаки из первого изображения (600-800 мс) 3. Обнаружить признаки из копии (100-200 мс)   -  person DavidGSola    schedule 20.11.2014
comment
как насчет обнаружения на совершенно другом изображении (того же размера) после обнаружения на первом изображении?   -  person Micka    schedule 20.11.2014
comment
Тот же результат. Первое изображение 600-800 ms и второе изображение 100-200 ms. Может быть, с помощью detector->detect(..) инициализировать что-то внутри детектора?   -  person DavidGSola    schedule 20.11.2014
comment
Нет, я только что создал еще один детектор, и он занимает всего 100-200msи первый 600-800ms   -  person DavidGSola    schedule 20.11.2014
comment
возможно, первый вызов нуждается в разогреве (возможно, инициализация и т. д.). попробуйте сравнить 2-й и 3-й вызовы.   -  person Zaw Lin    schedule 20.11.2014
comment
2-й, 3-й и последующие вызовы всегда 100-200 ms, независимо от того, тот же детектор или новый при каждом вызове.   -  person DavidGSola    schedule 20.11.2014


Ответы (2)


обратите внимание, что gettimeofday использует время стены, в то время как для подобных задач обычно требуется время процессора/часы.

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

int64 t0 = cv::getTickCount();
//
// some lengthy op.
//
int64 t1 = cv::getTickCount();
double secs = (t1-t0)/cv::getTickFrequency();
person berak    schedule 20.11.2014
comment
Тот же результат с идентичными изображениями. Test(1): t0-t1 (not in seconds) = 1444919 Test(2): t0-t1 (not in seconds) = 274456 - person DavidGSola; 20.11.2014
comment
@berak Разве у вас не было ловкого трюка для профилирования разделов кода? Я помню, как какой-то ответ на другой вопрос на SO. - person a-Jays; 20.11.2014
comment
@a-Jays, может быть, это? но берите с долей скептицизма, однорезьбовые, да и замеры тоже требуют времени.. - person berak; 20.11.2014
comment
@berak да, тот. Довольно полезно. Может в сочетании с chrono? - person a-Jays; 20.11.2014

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