использовать значения (функции) в векторе для вычисления сходства косинуса для opencv

Недавно я работал над проектом, в котором я извлек некоторые функции, касающиеся изображения, и хочу выяснить, есть ли какие-либо сходства между двумя изображениями, использующими эти функции. Вот список функций, которые я извлек:

  1. Соотношение сторон (ширина/высота)
  2. Нормализованная область (обрезанная область области исследования для области входного изображения)
  3. Центр обрезанного изображения
    и другие элементы одного изображения

Теперь я хочу передать эти значения в вектор и использовать этот вектор, чтобы найти косинусное сходство. Короче говоря, используйте такой вектор из двух изображений и найдите сходство между ними. Я знаю, как работает перекрестное произведение двух векторов, но
мне нужна помощь в сохранении этих изображений в вектор и использовании вектора. Любые предложения будут глубоко оценены.


person Shruthi Kodi    schedule 08.05.2015    source источник


Ответы (1)


о, не слишком сложно.

шаг 1: заполните свою функцию (коврик) числами, один за другим:

Mat feature; // you could use a std::vector, too, but cv::Mat has the 
             // handy dot-product used below already built in.
feature.push_back(aspect_ratio);
feature.push_back(area);
feature.push_back(center.x);
feature.push_back(center.y);
feature.push_back(more_stuff);
...

шаг 2: чтобы сравнить эти функции, используйте норму косинуса:

Mat feature_a, feature_b; // composed like above
double ab = feature_a.dot(feature_b);
double aa = feature_a.dot(feature_a);
double bb = feature_b.dot(feature_b);
return -ab / sqrt(aa*bb);
person berak    schedule 08.05.2015
comment
Спасибо, Берак. Я понимаю, как вы передаете значения. Можем ли мы хранить какие-либо значения в матрицах? Я имею в виду, могут ли значения быть типами данных float и double? - person Shruthi Kodi; 09.05.2015
comment
1-й, который вы push_back() определите тип коврика. все, что после этого, будет преобразовано в тип 1-го. - person berak; 09.05.2015
comment
Привет @berak, я пытаюсь использовать код, с которым ты мне помог, но я вижу, что тета-значения отрицательные. Что я могу из этого сделать? - person Shruthi Kodi; 13.05.2015
comment
откуда мне знать, что такое тета? (весь контекст отсутствует) - person berak; 13.05.2015
comment
Извините моя ошибка! Я предположил, что -ab/sqrt(aa*bb) является тета-значением. Теперь я понимаю, что это значение cos(theta). Спасибо! - person Shruthi Kodi; 13.05.2015
comment
У меня есть сомнения относительно подобия косинусов. Может ли косинусное сходство двух векторов быть отрицательным? Кроме того, есть ли какая-либо функция в opencv или C++, которая может вычислить тета из значения cos theta (если значение отрицательное)? - person Shruthi Kodi; 14.05.2015
comment
Спасибо @berak!! Похоже, я забыл свою базовую тригонометрию здесь. Тупые углы дают отрицательные значения cos тета. А косинусное сходство говорит, Чем ближе к нулю, тем больше они похожи. Итак, я получил свой ответ. - person Shruthi Kodi; 14.05.2015
comment
уф, я рад, что ты сказал лучшие слова, которые я когда-либо мог бы сказать;) - person berak; 14.05.2015