2014-10-19 3 views
2

Я пытаюсь оптимизировать свой угловой детектор Harris, чтобы сделать его достаточно быстрым для экстракции в режиме реального времени, который в конечном итоге будет использоваться в приложениях SLAM.Оптимизация углового детектора harris

Традиционный Харриса детектор выполняет следующие действия: производные

  1. высчитывает изображения (градиенты) Ix и Iy с использованием образа ядра свертки (k_dx и k_dy).
  2. вычислить производные второго порядка Ixx = Ix^2, Iyy = Iy^2 и Ixy = Ix * Iy.
  3. Отфильтруйте три производных второго порядка из шага 2 с использованием гауссова ядра (k_gaussian).
  4. Рассчитать реакцию Харриса по формуле, указанной в литературе.

Пока все хорошо. Я выполнил вышеуказанные шаги и имею рабочую программу. Однако мы знаем, что свертка является коммутативной алгеброй, а это означает, что:

  1. е # г = г # е
  2. F # (г # ч) = (е # г) # ч
  3. F # (г + Н) = (F # г) + (F # ч)
  4. постоянной * (е # г) = (постоянная * е) # г

где (#) является операция свертки.

Таким образом, по существу мы можем комбинировать различные ядра, чтобы сократить время вычислений.
Я надеялся использовать это в своих интересах для объединения ядра градиента изображения, используемого в шаге (1), с гауссовым ядром, используемым на шаге (3), чтобы сократить время вычисления. К сожалению, стадия (2) мешает мне делать так, как:
[(IM # k_dx)^2] # k_gaussian =! (И.М. # k_dx # k_gaussian)^2

где И.М. это изображение. поэтому два ядра нельзя комбинировать.

Мой вопрос: есть ли способ сделать это или это просто невозможно? Если это невозможно, то есть способ вычислить объединенное ядро, которое приблизительно соответствует истинному ответу. Даже если это плохое приближение, возможно, стоит уменьшить стоимость вычислений.

В случае, если вам интересно, я уже использую CUDA для выполнения моих сверток изображений на графическом процессоре, а угловой детектор уже довольно быстр. но мне нужно улучшить его дальше, чтобы выделить больший фрагмент временного интервала для остальных алгоритмов SLAM.

+0

Там есть уже хороший ответ. На ум приходят две вещи: (a) выберите детектор функций, оптимизированный для GPU/CUDA. (б) преждевременная оптимизация. Если угловой детектор быстрый, сколько вы получите, если удвоить скорость? Похоже, что он может переместиться с 5% времени до 2,5% времени ... – Unapiedra

ответ

2

Прямая комбинация ядер для использования свертки невозможна. Ixx = Ix^2, Iyy = Iy^2 и Ixy = Ix * Iy НЕ найдены сверткой (она не является линейной).

Некоторые приемы для оптимизации можно найти в «LOCOCO: LOW СЛОЖНОСТИ УГЛОВОЙ ДАТЧИК»

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