Сопоставление дескриптора OpenCV SURF

Это функция для сравнения дескрипторов SURF, которую я нашел в find_obj.cpp образцов OpenCV. Я в принципе не могу понять, как это вычисляет евклидово расстояние между дескрипторами.

Вычисляется ли это для каждого i-го дескриптора или всего изображения сразу?

Я знаю, что это основной вопрос, но я очень ценю ваш ответ. Спасибо.

double
compareSURFDescriptors( const float* d1, const float* d2, double best, int length )
{
    double total_cost = 0;
    assert( length % 4 == 0 );
    for( int i = 0; i < length; i += 4 )
    {
        double t0 = d1[i  ] - d2[i  ];
        double t1 = d1[i+1] - d2[i+1];
        double t2 = d1[i+2] - d2[i+2];
        double t3 = d1[i+3] - d2[i+3];
        total_cost += t0*t0 + t1*t1 + t2*t2 + t3*t3;
        if( total_cost > best )
            break;
    }
    return total_cost;
}

person ahirnish    schedule 05.03.2014    source источник


Ответы (2)


Для каждого i-го дескриптора на изображении 1 до каждого j-го дескриптора на изображении 2.

person old-ufo    schedule 05.03.2014

Объяснение в основном основано на литературе (Bay et al. 2004) .

Допустим, у нас есть изображение с обнаруженными ключевыми точками. Чтобы дескриптор был рассчитан для ключевой точки, вокруг нее определяется квадратная область (согласно статье используется окно размером 20s, где s — масштаб, на котором была обнаружена ключевая точка). Затем эта область делится на квадратные подобласти 4X4=16 (см. изображение). Для каждого из этих субрегионов вычисляются значения дескриптора 4, что приводит к 4-мерному вектору vi=[a1i,a2i,a3i,a4i] для i=[1:16] (см. документ или здесь, чтобы понять, что это за значения). Следовательно, конечный вектор дескриптора аккумулирует значения этих 16 4-мерных векторов одно за другим. Следовательно, дескриптор приводит к вектору размером 16 * 4 = 64-dim.

Подводя итог: каждая ключевая точка описывается 64-вектором. Каждые 4 значения в этом векторе описывают одну из 16 подобластей в окрестностях ключевой точки. (это также может быть 128 для расширенной версии SURF-128)

введите здесь описание изображения

Итак, если вы видите общий код C++, вход этой функции — это всего один дескриптор (одна ключевая точка) от объекта (d1) и один дескриптор от изображения (d2). В основном сравнение ведется между 2 64-мерными векторами (или 128 в случае расширенной версии). Утверждение, что длина вектора должна быть кратна 4, подтверждает, что эти дескрипторы образованы 4-мерными векторами, добавленными один за другим.

Чтобы определить, похожа ли ключевая точка объекта на ключевую точку изображения, вы сравниваете одни и те же субрегионы вокруг них. По этой причине каждые 4 значения сравниваются вместе (вычисляется их разница/расстояние), и общая стоимость увеличивается (в зависимости от того, насколько они отличаются). Если общая стоимость становится больше порогового значения (лучшее), то нет смысла продолжать сравнение, баллы не похожи!

Надеюсь, это помогло, и я не запутал вас еще больше!

person GStav    schedule 03.03.2016