Итак, как я могу вызвать функцию vl_ubcmatch
в коде C?
Это функция MEX, которая только предназначен для вызова из MATLAB. Вы не можете повторно использовать его как есть из программы C общего назначения.
Цель определить, содержит ли изображение объект на другом изображении [...] Как выполнить алгоритм сопоставления SIFT, если я использую vlfeat?
VLFeat C API не предоставляет встроенных функций сопоставления SIFT. Таким образом, в основном вам нужно адаптировать так называемый раздел кода ratio test [1] из этого раздел кода MATLAB C, что довольно просто (см. ниже).
Основным недостатком, если вы хотите выполнить надежное сопоставление, является то, что эта функция не учитывает геометрию, то есть координаты ключевых точек.
Что вам нужно дополнительно, так это проверка геометрической согласованности, которая обычно выполняется путем выяснения, есть ли гомография между двумя изображениями (используя в качестве входных данных соответствия дескрипторов, полученные с помощью теста отношения). Это делается с помощью алгоритма, подобного RANSAC, поскольку соответствия могут включать выбросы.
Но также вы можете ускорить вычисление соответствий с помощью kd-tree.
Таким образом, альтернативой, если вам нужна простая реализация C, является использование Open SIFT Роба Хесса, который включает в себя все, что вам нужно. , а также готовый к использованию инструмент командной строки (и, следовательно, пример) сопоставления:
См. match.c.
typedef struct {
int k1;
int k2;
double score;
} Pair;
Pair *
compare(
Pair *pairs,
const float *descr1,
const float *descr2,
int K1,
int K2,
int ND,
float thresh
)
{
int k1, k2;
/* Loop over 1st image descr. */
for (k1 = 0; k1 < K1; ++k1, descr1 += ND ) {
float best = FLT_MAX;
float second_best = FLT_MAX;
int bestk = -1;
/* Loop over 2nd image descr. and find the 1st and 2nd closest descr. */
for (k2 = 0; k2 < K2; ++k2, descr2 += ND ) {
int bin;
float acc = 0;
/* Compute the square L2 distance between descriptors */
for (bin = 0 ; bin < ND ; ++bin) {
float delta = descr1[bin] - descr2[bin];
acc += delta*delta;
if (acc >= second_best)
break;
}
if (acc < best) {
second_best = best;
best = acc;
bestk = k2;
}
else if (acc < second_best) {
second_best = acc;
}
}
/* Rewind */
descr2 -= ND*K2;
/* Record the correspondence if the best descr. passes the ratio test */
if (thresh * best < second_best && bestk != -1) {
pairs->k1 = k1;
pairs->k2 = bestk;
pairs->score = best;
pairs++;
}
}
return pairs;
}
K1
: количество дескрипторов в изображении 1,
K2
: количество дескрипторов на изображении 2,
ND
: размер дескриптора (= 128 для SIFT),
descr1
и descr2
: дескрипторы изображения 1 и 2 соответственно. в основном порядке строк, например, K1
строк x ND
столбцов),
thresh
: пороговое значение теста отношения, например, 1.5
в коде MATLAB.
[1] см. 7.1 Сопоставление ключевых точек из статьи Д. Лоу.
person
deltheil
schedule
15.11.2014