2014-11-20 6 views
0

Я пытаюсь вычислить время, которое моя программа берет, чтобы обнаружить ключевые точки из изображения. Если в моей программе на C++ я делаю это два раза (с одним и тем же изображением), между ними существует огромная разница. Первый раз он использует около 600-800 мс, а во второй раз всего 100-200 мс.OpenCV вычисляет функции обнаружения времени

Кто-нибудь знает, что происходит?

Вот код, где я получаю раз:

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; 
} 

Вот пример:

Sample

+0

при создании 2-го изображения с идентичной пиксельной информации: 'резюме :: Mat imagen2 = imagen1.clone(),' это будет необходимо '100-200 ms' или '600-800 ms' обнаружить? Не уверен, что openCV запоминает «интегральные изображения», вычисленные SURF-Detector, до тех пор, пока входное изображение не будет освобождено или что-то в этом роде ... – Micka

+0

Для этого требуется 100-200 мс. Мои шаги: 1. Клонировать изображение 2. Обнаруживать функции с первого изображения (600-800 мс). 3. Обнаруживать функции из копии (100-200 мс) – DavidGSola

+0

, а что об обнаружении в совершенно другом изображении (того же размера) после обнаружения в первое изображение? – Micka

ответ

0

Обратите внимание, что gettimeofday использует настенные часы, в то время как проблемы, подобные этому u sually требуется 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 (не в секундах) = 1444919' 'Тест (2): t0-t1 (не в секундах) = 274456' – DavidGSola

+0

@berak У вас не было аккуратного трюка для профилирования разделов кода ? Я помню, как какой-то ответ на другой вопрос о SO. –

+0

@ a-Jays, [возможно, это] (http://stackoverflow.com/questions/26677324/putting-execution-timing-code-into-a-function-opencv/26678075#26678075)? но возьмите с солью соль, одиночную резьбу, и измерение займет время тоже .. – berak

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); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^