sensor_exposure_control.py
# Эта работа лицензирована по лицензии MIT.
# Copyright (c) 2013-2023 OpenMV LLC. All rights reserved.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Управление экспозицией датчика
#
# В этом примере показано, как управлять
# экспозицией датчика камеры вручную, а не полагаться на автоматическое управление экспозицией.
# В чём разница между управлением усилением и экспозицией?
#
# Что ж, увеличивая время экспозиции изображения, вы получаете больше
# света на камере. Это даёт наилучшее отношение сигнал/шум. В целом
# вы всегда хотите увеличивать время экспозиции... за исключением случаев, когда
# увеличение времени экспозиции снижает максимально возможную частоту кадров,
# и если что-то в изображении движется, оно начнёт размываться сильнее при
# более высоком времени экспозиции. Управление усилением позволяет увеличить выходной сигнал на
# пиксель с помощью аналоговых и цифровых множителей... однако это также усиливает
# шум. Поэтому лучше позволить экспозиции увеличиваться как можно больше,
# а затем использовать управление усилением, чтобы компенсировать оставшуюся разницу.
import csi
import time
# Измените это значение, чтобы настроить экспозицию. Попробуйте 10.0/0.1/и т.д.
EXPOSURE_TIME_SCALE = 1.0
csi0 = csi.CSI()
csi0.reset() # Сброс и инициализация датчика.
csi0.pixformat(csi.RGB565) # Установить формат пикселей RGB565 (или GRAYSCALE)
csi0.framesize(csi.QVGA) # Установить размер кадра QVGA (320x240)
# Вывести начальное время экспозиции для сравнения.
print("Initial exposure == %d" % csi0.exposure_us())
csi0.snapshot(time=2000) # Подождать, пока настройки вступят в силу.
clock = time.clock() # Создать объект clock для отслеживания FPS.
# Вам нужно отключить автоматическое управление усилением и автоматический баланс белого,
# иначе они изменят усиление изображения, отменяя любые настройки экспозиции,
# которые вы установили...
csi0.auto_gain(False)
csi0.auto_whitebal(False)
# Нужно дать время, чтобы указанные выше настройки вступили в силу...
csi0.snapshot(time=500)
current_exposure_time_in_microseconds = csi0.exposure_us()
print("Current Exposure == %d" % current_exposure_time_in_microseconds)
# Автоматическое управление экспозицией (AEC) включено по умолчанию. Вызов функции ниже
# отключает автоматическое управление экспозицией датчика. Дополнительный аргумент "exposure_us"
# затем переопределяет значение автоматической экспозиции после отключения AEC.
csi0.auto_exposure(
False, exposure_us=int(current_exposure_time_in_microseconds * EXPOSURE_TIME_SCALE)
)
print("New exposure == %d" % csi0.exposure_us())
# csi0.exposure_us() возвращает точное время экспозиции датчика камеры
# в микросекундах. Однако это число может отличаться от заданного, потому что
# код датчика преобразует время экспозиции в микросекундах
# во время строки/пикселя/такта, которое не идеально совпадает с микросекундами...
# Если вы хотите снова включить автоматическую экспозицию, выполните: csi0.auto_exposure(True)
# Обратите внимание, что датчик камеры затем будет изменять время экспозиции по своему усмотрению.
# Выполнение: csi0.auto_exposure(False)
# Просто отключает обновление значения экспозиции, но не меняет значение
# экспозиции, которое датчик камеры определил как подходящее.
while True:
clock.tick() # Обновить счётчик FPS.
img = csi0.snapshot() # Сделать снимок и вернуть изображение.
print(clock.fps()) # Примечание: OpenMV Cam работает примерно вдвое медленнее при подключении
# к IDE. FPS должен увеличиться после отключения.