Android-расстояние дескрипторов HOG

Я хочу сравнить 2 дескриптора HOG в приложении для Android с использованием OpenCV. Я нахожу трудности в вычислении евклидова расстояния между двумя векторами, которые имеют тип MatOfFloat. У вас есть пример кода, который может мне помочь.

Функция, вычисляющая дескрипторы HOG, называется mHOGDescriptor.compute(imgMat, descriptors, winStride, padding, location); вывод этой функции - дескрипторы, что его тип - MatOfFloat. Как только я найду дескрипторы HOG для двух изображений, я хочу вычислить евклидово расстояние между ними и именно здесь я нахожу проблему.

Я пробую этот код, но он не работает:

for(int i=0; i<imgMat.rows();i++)
{ 
    for(int j=0; j<imgMat.cols();j++)
    { 
        distance1=(int) (distance1+(mDescriptors1.get(i, j)-mDescriptors2.get(i, j)));
    }
}

person ha_ell    schedule 17.11.2015    source источник
comment
Функция cv::HogDescriptor::compute возвращает вектор‹float›. Это то, что вы хотите? Если нет, добавьте дополнительную информацию о том, что вы пытаетесь сделать, и коде, который вы используете.   -  person Adrien Descamps    schedule 18.11.2015
comment
Здравствуйте, спасибо за ваш ответ. На самом деле, я пытаюсь разрабатывать на Java, поэтому функция, которая вычисляет дескрипторы HOG, — это mHOGDescriptor.compute(imgMat, descriptors, winStride, padding, location); вывод, если эта функция является дескриптором, что его тип - MatOfFloat. Как только я найду дескрипторы HOG для двух изображений, я хочу вычислить евклидово расстояние между ними и именно здесь я нахожу проблему.   -  person ha_ell    schedule 18.11.2015
comment
Я пробую этот код, но он не работает: for(int i=0; i‹imgMat.rows();i++){ for(int j=0; j‹imgMat.cols();j++){ Distance1=(int ) (distance1+(mDescriptors1.get(i, j)-mDescriptors2.get(i, j);));}}   -  person ha_ell    schedule 18.11.2015
comment
Пожалуйста, отредактируйте свой вопрос, чтобы добавить дополнительную информацию и код из ваших комментариев.   -  person Adrien Descamps    schedule 18.11.2015


Ответы (1)


Я вижу две проблемы с вашим кодом:

  1. Это неправильная формула для евклидова расстояния.
  2. Вы конвертируете в int на каждой итерации. Это не очень хорошая идея, потому что значения дескриптора являются плавающими и меньше 1 (он состоит из нормализованных гистограмм), поэтому вы округляете расстояние до нуля.

Попробуйте следующий код:

distance=0;
for(int i=0; i<imgMat.rows();i++)
{ 
    for(int j=0; j<imgMat.cols();j++)
    {
        distance+=(mDescriptors1.get(i, j)[0]-mDescriptors2.get(i, j)[0])*(mDescriptors1.get(i, j)[0]-mDescriptors2.get(i, j)[0]);
    }
}
person Adrien Descamps    schedule 18.11.2015
comment
Это тоже не работает. Тип mDescriptors1.get(i, j) — double[], поэтому вычитание не разрешено. - person ha_ell; 19.11.2015