2013-04-11 4 views
9

Я разрабатываю приложение, в котором я использую SIFT + RANSAC и Homography для поиска объекта (OpenCV C++, Java). Проблема, с которой я столкнулся, заключается в том, что там, где есть много выбросов, RANSAC работает плохо.Совпадения и распознавание SIFT?

По этой причине я хотел бы попробовать то, что автор SIFT сказал, что это очень хорошо: голосование.

Я прочитал, что мы должны голосовать в художественном пространстве 4 размерности, где 4 измерения являются:

  • Местоположение [х, у] (кто-то говорит Traslation)
  • Масштаб
  • Ориентация

Хотя с OpenCV легко получить матч scale и orientation с:

cv::Keypoints.octave 
cv::Keypoints.angle 

Мне трудно понять, как я могу рассчитать местоположение.

Я нашел interesting slide где только one match мы способны нарисовать прямоугольник:

Но я не понимаю, как я мог бы сделать эту рамку только с одной спички. Любая помощь?

ответ

5

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

Допустим, вы соответствовали особенностям: f1 от изображения 1 и f2 из изображения 2. Пусть (x1,y1) быть место f1 в изображении 1, пусть s1 будет его масштаб, и пусть theta1 быть это ориентация. Аналогичным образом у вас есть (x2,y2), s2 и theta2 для f2.

Перевод между двумя функциями: (dx,dy) = (x2-x1, y2-y1).

Изменение масштаба между двумя характеристиками: ds = s2/s1.

Вращение между двумя функциями: d_theta = theta2 - theta1.

Так, dx, dy, ds и d_theta являются размеры вашего Hough пространства. Каждый бит соответствует преобразованию подобия.

После того, как вы выполнили голосование Hough и нашли максимальный бит, этот бит дает вам преобразование от изображения 1 к изображению 2. Одна вещь, которую вы можете сделать, - это взять ограничивающий прямоугольник изображения 1 и преобразовать его с помощью этого преобразования: примените соответствующий перевод, поворот и масштабирование к углам изображения. Как правило, вы вставляете параметры в матрицу преобразования и используете однородные координаты. Это даст вам ограничивающий прямоугольник в изображении 2, соответствующий обнаруженному вами объекту.

+0

Я отредактировал ответ. – Dima

+1

В одном матче вам не нужно преобразование Хафа. Вы принимаете разницу в x и y (перевод), разницу в ориентации (вращении) и соотношении масштабов (шкалы). Затем вы помещаете их в матрицу. – Dima

2

Для того чтобы добавить Dima, необходимо добавить, что пространство 4D Hough квантовано в (возможно, небольшое) число ящиков 4D, где каждый квадрат соответствует аналогичности, заданной его центром.

Затем для каждого возможного сходства, полученного путем предварительного согласования признаков, добавьте 1 в соответствующий квадрат (или cell) в 4D-пространстве. Выходное сходство задается ячейкой с большим количеством голосов.

Для того чтобы вычислить преобразование из 1 матча, просто используйте формулы Димы в его ответе. Для нескольких пар совпадений вам может понадобиться использовать по крайней мере квадраты.

Наконец, преобразование может быть применено с помощью функции cv::warpPerspective(), где третья строка матрицы перспективы установлена ​​на [0,0,1].

+0

это не объясняет, как нарисовать ограничительную рамку только с одним совпадением – dynamic

+0

Ограничительная рамка рисуется путем применения окончательного сходства (полученного от 1 матча или от голосования в Hough) до синих и желтых полей на изображении модели, затем рисования в новом изображении. – sansuiso

+0

Можете ли вы опубликовать пример о том, как подсказать окончательную матрицу подобия (просто учитывая одно совпадение)? – dynamic

2

При использовании преобразования Hough вы создаете подпись, сохраняющую векторы смещения каждой функции из центроида шаблона (либо (w/2,h/2), либо с помощью центральных моментов).

E.g. для 10 функций SIFT, найденных на шаблоне, их относительные позиции в соответствии с центроидом шаблона составляют vector<{a,b}>. Теперь давайте искать этот объект в образе запроса: каждая функция SIFT, найденная в изображении запроса, соответствующая одному из 10 шаблонов, передает голосование соответствующему центроиду.

votemap(feature.x - a*, feature.y - b*)+=1 где a, b соответствует этому конкретному вектору признаков.

Если некоторые из этих функций успешно выполнены в одной точке (важно кластеризация), вы нашли экземпляр объекта.

enter image description here

Подпись и голосование обратная процедура. Предположим, что V=(-20,-10). Поэтому во время поиска в новом изображении, когда найдены два совпадения, мы определяем их ориентацию и размер и проводим соответствующее голосование. Например. для прямоугольного центроида будет V'=(+20*0.5*cos(-10),+10*0.5*sin(-10)) вдали от функции SIFT, потому что он имеет половину размера и поворачивается на -10 градусов.

+0

Что значит «один матч»? Какова природа согласованной функции? Точка (x, y) или область (x, y, a, b, theta), как желтая рамка в ваших примерах? – William

+0

Затем вы должны включить в подпись SIFT ** Descriptor ** и извлечь из DescriptorMatcher поворот и масштабирование для совпадающих патчей. – William

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