Android Camera2: Как реализовать полуавтоматический c Режим приоритета скорости затвора - PullRequest
1 голос
/ 11 февраля 2020

Цель

  • Захват изображений с помощью Android смартфонов, подключенных к движущимся транспортным средствам
  • частота: 1 Гц
  • Эталонная модель: Google Pixel 3a
  • представляющие интерес объекты: дорога / путь перед транспортным средством
  • использование изображения: в качестве входных данных для машинного обучения (например, RNN) для выявления повреждений на поверхностях дороги / пути
  • среда захвата: на улице, только в облачные дни

Текущее состояние

  • Захват работает (в настоящее время используется JPEG вместо RAW из-за размер данных)
  • автоэкспозиция работает
  • stati c фокусное расстояние работает

Challenge

  • Поверхность проезжей части / дорог на снимках часто размыта
  • Источник размытия в движении в основном от дрожащего автомобиля / стационарного телефона
  • Чтобы уменьшить размытость при движении, мы хотим используйте «Режим приоритета скорости затвора»
    • , т.е. минимизируйте скорость затвора => увеличьте ISO ( принять увеличение шума)
    • доступна только одна диафрагма (f / 1.8)
    • в API-интерфейсе Camera2 отсутствует «Режим приоритета скорости затвора» (сокращение: Tv / S-Mode)
    • CameraX API (пока) не предлагает то, что нам нужно (stati c фокус, режим Tv / S)

Шаги

  • Установите выдержку затвора на максимально возможную поддерживаемую экспозицию (просто)
  • Автоматически настраивайте настройку ISO для автоматической экспозиции (например, это formular )
  • Для расчета ISO единственной недостающей частью является уровень освещенности (EV)

Вопрос

  • Как я могу оценивать EV постоянно во время съемки, чтобы автоматически регулировать ISO при использовании фиксированной скорости затвора?

Пока что есть идеи:

  1. Если бы я мог прочитать " рекомендации »из процедуры автоматической экспозиции (AE) Camera2 без фактического включения AE_MODE_ON, тогда я мог легко рассчитать EV. Однако я до сих пор не нашел API для этого. Я предполагаю, что это невозможно без маршрутизации устройства.
  2. Если датчик внешней освещенности предоставит всю информацию, необходимую для автоматического экспонирования (расчета EV), это также будет очень легко. Однако, насколько я понимаю, он измеряет только падающий свет, а не отраженный свет, поэтому измерение не учитывает фактические объекты на изображениях (как их поверхности отражают свет)
  3. Если бы я мог получить информацию от Пиксели последних захватов это также было бы выполнимо (если время расчета соответствует времени между двумя захватами). Однако, исходя из моего понимания, пиксельная «яркость» сильно зависит от захваченных объектов, то есть, если изменяется яркость захваченных объектов (много «черных лошадей» или «белых медведей» на обочине дороги / пути), я бы вычислил неверные значения EV.
  4. Захват автоматически экспонированных изображений между фактическими снимками и вычисление уровней освещенности на основе автоматически выбранных настроек, используемых в промежуточных снимках для фактических снимков. Это было бы относительно "хорошим" способом из моего понимания, но это довольно сложно для ресурсов - я не уверен, что для этого достаточно времени между двумя захватами.

Может быть, я не не вижу более простого решения. Кто-нибудь делал что-то подобное?

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Да, вам нужно реализовать собственный алгоритм автоэкспозиции. Все «реальный» AE должен go на это изображение, захваченное датчиком, а также, так что в теории вы можете создать что-то столь же хорошо угадывает правильный уровень освещенности.

1002 * На практике это маловероятно вы можете сопоставить его как с более длительной обратной связью l oop (алгоритм AE может немного обмануть требования синхронизации и обновлять настройки датчика быстрее, чем приложение), так и с тем, что алгоритм AE может использовать аппаратные единицы статистики (собирать гистограммы и средние значения по сцене), что делает его более эффективным.

Но простым алгоритмом автоэкспозиции будет усреднение всей сцены (или части сцены, или каждого десятого пикселя сцена и т. д. c), и если это среднее значение ниже половины максимального значения, увеличьте ISO, а если оно выше, уменьшите. Основой c управления обратной связью l oop, другими словами. Со всеми вопросами о стабильности, конвергенции и пр. c, которые применимы. Так что немного понимания теории управления может быть весьма полезным здесь. Я бы порекомендовал YUV-выход низкого разрешения (возможно, 640x480?) Для ImageReader с камеры, чтобы использовать его в качестве источника данных, а затем просто смотрю на канал Y. В этом случае не нужно тратить кучу данных.

Или, как упоминалось в hb0, если у вас очень ограниченный набор внешних условий, вы можете попробовать жестко закодировать значения для каждого из них. Но диапазон яркости наружного освещения может быть довольно большим, поэтому для его работы потребуется немало испытаний, чтобы убедиться, что он будет работать, плюс ручной выбор правильных значений каждый раз.

1 голос
/ 11 февраля 2020

Когда снимки делаются только в определенных c условиях освещения, таких как "на улице, облачно":

Табличные значения могут использоваться для значения экспозиции (EV) вместо использования измерений освещенности.

Пример

  • EV100 (iso100) для Наружной облачности (O C) = 13
  • EV (динамический c изо) для O C = EV100 + log2 (iso / 100)

Используя эту формулу вместе с этими формулами , мы можем вычислить ISO от:

  • диафрагма (фиксированная)
  • выдержка (выбрано вручную)

Кроме того, мы могли бы добавить опцию пользовательского интерфейса, чтобы выбрать "свет" ситуация "как:

  • на улице, облачно
  • на улице, солнечно
  • et c.

Это, вероятно, не самый точный, но пока первый, простой способ продолжить создание прототипа.

...