2017-01-18 1 views
2

Я пишу алгоритм автоматической фокусировки. Для этого я использую шаговый двигатель, который имеет 3318 шагов для фокусировки.Самый короткий способ найти сфокусированную точку в алгоритме автоматической фокусировки

Чтобы найти фокус, после каждого кадра с камеры я беру статистику и выполняю некоторые вычисления, результатом чего является числовое значение, то есть значение фокусировки (fv). Таким образом, шаг двигателя, где я получаю максимальный fv, - это то, где мое изображение максимально сфокусировано.

Прямо сейчас, я просматриваю все точки, чтобы найти максимум fv, и он работает, но слишком долго; около 15 секунд.

Есть ли какой-либо алгоритм, который я могу использовать для уменьшения числа. шагов и минимизировать время, чтобы найти сфокусированную точку?

ответ

0

Если предположить, что существует:

  1. одиночный глобальный максимум счет резкости;
  2. Нет локальных максимумов

Тогда ваша функция фокусировки должна быть относительно гладкой.

В этом случае вы можете выполнить поиск быстрее, чем линейный.
В принципе, начните где-нибудь и начните катиться под гору.

Вы можете использовать, например. Golden section search или путем вычисления локальных изменений (производных) используют методы Ньютона (скатывание вниз) или Конъюгатный градиент (прыгающий под гору).

0

Во-первых, выяснить, что именно узким местом является:

  • время, чтобы взять рамку
  • время для перемещения шагового двигателя в определенное положение
  • время обработки кадра и получить фокус значение функции

Затем узнайте что-нибудь о функциональной зависимости вашей функции фокусировки от положения фокусировки в целом (для ваших образцов).

  • Является ли оно гладким или неровным (шумным)?
  • Широкий (очень плоский максимум) или он узкий (очень крутой, малый максимум)?
  • Это примерно квадратичный?

Скорее всего, шума мало, максимум довольно широкий и приблизительно квадратичный.

Тогда Newton's method или алгоритм установки Levenberg-Marquardt сходится в нескольких итерациях.

Однако они могут найти только локальные оптимумы, а также золотой поиск, упомянутый в ответе Adi Shavit.

Когда шум проблема, рекомендую вид надежное, масштабирование в подходе:

  • Мера 10 кадров по всему диапазону (332 шагов каждые)
  • сгладить полученные 10 значений незначительны, если есть шум присутствует
  • занять позицию лучшего кадра
  • Measure 20 кадров в диапазоне [-330,330] шагов вокруг этого лучшего кадра с размером шага 33 шагов на кадр
  • Smooth получаемые 20 значений немного, если присутствует шум
  • Возьмите положение лучшей рамы
  • Измерьте 10 кадров в диапазоне [-15, 15] шагов вокруг этой лучшей рамы с шагом шага 3 шага за кадр
  • Smooth получившиеся 10 значений немного, если есть шум, присутствующий
  • Возьмите лучший кадр и измерить один кадр выше и ниже
  • Возьмите лучший кадр, это положение фокуса

Это необходимо 10+ 20 + 10 + 2 = 32 кадра s и, следовательно, может привести к примерно 100-кратному ускорению по сравнению с использованием 3318 кадров или (0,15 с вместо 15 с), если принимать рамы является важной частью и не перемещать шаговый двигатель.

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