API Camera2 – Как установить длительное время экспозиции

Я пытаюсь захватить изображения с 30-секундным временем экспозиции в моем приложении (я знаю, что это возможно, так как это позволяет фондовая камера).

Но SENSOR_INFO_EXPOSURE_TIME_RANGE (который должен быть в наносекундах) дает мне диапазон:

13272 - 869661901 

В секундах это было бы просто

 0.000013272 - 0.869661901 

Это, очевидно, меньше секунды.

Как я могу использовать более длительное время экспозиции?

Заранее спасибо!.

Ответ на ваш вопрос :

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

Ответ, который вы хотите :

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

На высоком уровне вам нужно создать List CaptureRequest и передать его в CameraCaptureSession.captureBurst(...) . Это позволит делать снимки с минимальным интерстициальным временем. Когда каждый кадр данных изображения доступен, передайте его в какой-то новый буфер где-нибудь и накапливайте информацию (простое поэтапное добавление). Это, вероятно, наиболее правильно сделано с Allocation как выходной Surface и некоторым RenderScript.

Примечания к формату данных :

  • Правильный способ сделать это – использовать выходной формат RAW_SENSOR , если сможете. Таким образом, накопленный выход на самом деле прямо пропорционален свету, который падал на датчик в течение всего 30 секунд.

  • Если вы не можете использовать это, по какой-то причине я бы рекомендовал использовать вывод YUV_420_888 и убедиться, что вы настроили кривую кривой тона как линейную (к сожалению, вам нужно сделать это вручную, создав кривую с двумя точками). В противном случае введенная нелинейность испортит нашу схему. (Хотя я не уверен, что простое дополнение в прямом пространстве линейки YUV, но это, по крайней мере, первый подход). Используете ли вы этот подход или RAW_SENSOR , вы, вероятно, захотите применить свою собственную карту гамма-кривой / тона после Накопление, чтобы заставить его «выглядеть правильно».

  • Для любви к Пете не используйте выход JPEG по многим причинам, не последним из которых является то, что это, скорее всего, добавит много интерстициального времени между экспозициями, тем самым разрушая наше приближение 30-х годов при непрерывной экспозиции.

Примечание об эквивалентности экспозиции :

Это даст почти то, что вы хотите, но не совсем. Он отличается двумя способами.

  1. В середине этого фрагмента времени экспозиции будут отсутствовать недостающие периоды информации о фотоне. Но о масштабе времени, о котором вы говорите (30-е годы), пропустили несколько миллисекунд света здесь и там тривиально.

  2. Изображение будет немного более дурным, чем если бы вы взяли истинную разовую экспозицию в 30 секунд. Это связано с тем, что каждый раз, когда вы считываете значения пикселей из фактического датчика, к информации добавляется небольшой электронный шум. Таким образом, в конечном итоге у вас будет в 35 раз больше этого аддитивного шума (из 35 экспозиций для вашей конкретной проблемы) в виде одного воздействия. Нет никакого способа обойти это, извините, но это может быть даже не заметно – это обычно довольно мало по сравнению с значимым фотографическим сигналом. Это зависит от качества датчика камеры (и ISO, но я полагаю, что для этого приложения вам нужно, чтобы он был высоким).

  3. (Бонус!). Эта экспозиция будет действительно превосходной в одном направлении. Области, которые могли бы быть насыщенными (чисто белыми) в 30-секундном экспонировании, по-прежнему сохраняют определение в этих гораздо более коротких экспозициях, поэтому вы в принципе гарантируете, что не потеряете свой высокий уровень Детали. 🙂

Вы не можете всегда доверять SENSOR_INFO_EXPOSURE_TIME_RANGE с мая 2017 года. Попробуйте вручную увеличить время и посмотреть, что произойдет. Я знаю, что мой Pixel на самом деле займет 1,9 секунды, но SENSOR_INFO_EXPOSURE_TIME_RANGE имеет значение в суб-диапазоне.