Как заблокировать автофокус - PullRequest
12 голосов
/ 30 апреля 2019

Есть ли способ предотвратить автофокусировку, используя любую из "стандартных" библиотек, таких как OpenCV, EmGU, DirectShow и т. Д.?

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

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

Ответы [ 3 ]

5 голосов
/ 05 мая 2019

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

Этот ТА вопрос содержит ответ, который описывает, как измерить, сфокусировано изображение или нет.Для этого вы можете использовать OpenCV Laplacian () ( Emgu.CV ).

Ключ в том, что сфокусированное изображение имеет гораздо более сильные градиентыи острые черты.Поэтому я предлагаю применить фильтр Гаусса-Лапласа, а затем посмотреть на распределение значений пикселей в результате.У сфокусированного изображения гораздо более высокие значения (поскольку изображение имеет более резкие градиенты).

Другой интересный способ определения наилучшего фокуса описан в этой статье .Техника используется в НАСА Curiosity Mars Rover.Идея состоит в том, чтобы сжать JPEG-кадры и использовать размер jpegs в качестве меры фокусировки.

Команда автофокуса дает команду камере перейти в указанную начальную позицию отсчета двигателя и собрать изображение,переместите указанное число шагов и соберите другое изображение, и продолжайте делать это, пока не достигнете заданного общего количества изображений, каждое из которых разделено указанным шагом отсчета двигателя.Каждое из этих изображений сжато в формате JPEG (Joint Photographic Experts Group; см. CCITT (1993)) с применением того же коэффициента качества сжатия.Размер файла каждого сжатого изображения является мерой детализации сцены, которая, в свою очередь, является функцией фокуса (изображение в фокусе показывает больше деталей, чем размытое, не в фокусе вид той же сцены).

OpenCV imencode () ( Emgu.CV ) можно использовать для сжатия изображения в формате JPEG.

Если вы хотите сфокусироваться на какой-то конкретной конюшнеобъект или область, и вы можете рассчитать / распознать его фиксированное положение, вы должны обработать только эту область, чтобы определить лучший фокус.При первом подходе вы можете применить Laplacian к обрезанной прямоугольной области или даже использовать непрямоугольную маску для вычисления «значения фокуса» результата, если вы знаете форму объекта.То же самое касается второго подхода - сжимайте только ту область интересов, на которой вы хотите сосредоточиться.Если вы хотите, чтобы он обрабатывал не прямоугольные области и знал форму области, сначала установите все пиксели, которые не покрывают область, на которую вы фокусируете, одним и тем же цветом.Это заставит алгоритм не учитывать регионы, на которые вам не нужно фокусироваться.

3 голосов
/ 07 мая 2019

Для веб-камер USB, совместимых с UVC (как и большинство), есть реальная возможность использовать автофокусировку камеры и затем заблокировать ее. Чтобы выяснить, позволяет ли камера делать это через UVC, в Linux можно использовать v4l2-ctl, который находится в пакете v4l-utils. v4l2-ctl -l перечисляет все доступные элементы управления, v4l2-ctl -c устанавливает значение для элемента управления, а v4l2-ctl -C получает значение.

Например, следующие команды сделали трюк для Microsoft LifeCam Cinema на коробке Ubuntu 16.04, в которой была запущена простая программа Python OpenCV для отображения текущего кадра:

> v4l2-ctl -d 0 -c focus_auto=1
> v4l2-ctl -d 0 -C focus_absolute
focus_absolute: 12

После перемещения объекта ближе к камере фокус изменился, и я получил другое значение для focus_absolute: (Таким образом, UVC дает доступ к тому, какое значение выбрал автофокус).

> v4l2-ctl -d 0 -C focus_absolute
focus_absolute: 17

Затем я переключился на ручную фокусировку, и это заблокировало значение, которое выбрал автофокус:

> v4l2-ctl -d 0 -c focus_auto=0
> v4l2-ctl -d 0 -C focus_absolute
focus_absolute: 17

Таким образом, для LifeCam Cinema единственное, что нужно сделать коду, - это сначала изменить focus_auto элемент управления на автоматический (1), а затем на ручной после блокировки фокуса.

Из Python я обычно запускаю v4l2-ctl просто используя subprocess.check_output(). Я помню, что видел библиотеки Windows для UVC, но никогда не играл с ними.

0 голосов
/ 09 мая 2019

Собственный Windows API для управления фокусом - это IAMCameraControl интерфейс со свойством CameraControl_Focus.Он доступен через DirectShow и, скорее всего (я не проверял, но ожидаю, что он будет там, как есть), а также через Media Foundation.Библиотеки, упомянутые в первом абзаце вопроса, работают поверх этих API.

Например, камера Logitech HD Webcam C615 (только что взявшая первую случайную с фокусировкой) предоставляет такие возможности в отношении фокусировки:

  • CameraControl_Focus: 51, флаги CameraControl_Flags_Auto |CameraControl_Flags_Manual, 0..255, шаг 17, по умолчанию 51, cap flags CameraControl_Flags_Auto |CameraControl_Flags_Manual

Это говорит о том, что диапазон составляет 0..255 с шагом 17, то есть камера имеет автоматическую фокусировку и ручную фокусировку из диапазона 16 настроек.API разработан таким образом, что можно потенциально автоматически сфокусироваться, затем прочитать автоматически определенные настройки, а затем переключиться на ручное управление с помощью этой настройки, блокирующей фокус (все через интерфейс IAMCameraControl).

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

При идентификации фокуса с помощью анализа изображения у вас уже есть указатели в соседних ответах.

...