Difference between revisions of "Autoexposure rus"

From ElphelWiki
Jump to: navigation, search
 
 
(12 intermediate revisions by 3 users not shown)
Line 1: Line 1:
На данный момент реализовал алгоритм автоэкспозиции, при заборе одиночных кадров через web-интерфейс надо получить несколько кадров подряд, пока погрешность не станет приемлемой.
+
{{ru|en=Autoexposure|cn=Autoexposure_cn}}
 +
 
 +
Выложил в CVS в camera333mjpeg автоэкспозицию - она запускается сразу же после старта камеры, и настраивается сразу же после первого кадра, полученного через web-интерфейс - т.е. самый первый кадр будет с настройками из web-интерфейса. Теперь поподробнее:
 +
 
 +
'''1.''' Автоэкспозиция рассчитывается в приложении apps/autoexp (в камере /usr/local/bin/autoexp), управляется (приведу описание без html, через командную строку) с помощью приложения autoexp_ctrl с такими параметрами:
 +
 
 +
''-s'' отобразить текущие настройки автоэкспозиции.
 +
 
 +
''-e'' включить автоэкспозицию.
 +
 
 +
''-d'' отключить автоэкспозицию
 +
 
 +
''-w, -h'' - ширина и высота окна рассчета автоэкспозиции (гистограммы), в процентах от изображения, получаемого с сенсора (т.е. изображения после сжатия)
 +
 
 +
''-l, -t'' - смещение окна рассчета автоэкспозиции (гистограммы), в процентах. 0% - крайние левое и верхнее положение, 100% - крайние нижнее и правое положение, 50% - строго по центру.
 +
 
 +
''-m'' - максимальное время экспозиции сенсора, которое может установить autoexp, в 0.1ms. (необходимо, чтобы в видеопотоке не падал fps)
 +
 
 +
''-o'' - в процентах, максимально допустимое переэкспонированное число пикселей (не от всего изображения, а только от окна гистограммы), с точностью до 0.01%
 +
 
 +
'''1.1.''' Сразу же после запуска используются такие установки: - 100% ширина и высота окна гистограммы, максимальное значение экспозиции - 400ms, допустимое число пересвеченных пикселей - 0.5%.
 +
 
 +
'''1.2.''' autoexp после запуска не убивается.
 +
 
 +
'''2.''' Алгоритм автоэкспозиции на данный момент изменяет только время экспонирования сенсора, никак не влияя на настройки gain. При этом после первого получения изображения через web-интерфейс, работает постоянно (если включен), не зависимо от работы компрессора (сжатия FPGA). При этом все установки времени экспозиции "перетираются" временем, рассчитанным в apps/autoexp. Латентность каждого пересчета - 4 кадра (1-й - получение гистограммы и передача в autoexp, второй - изменение времени автоэкспозиции в сенсоре без его остановки, поэтому третий - пропуск кадра с искаженной гистограммой, и четвертый - вычисление корректной гистограммы после применения последнего изменения). ''В дальнейшем будет проведена оптимизация латентности.''
 +
 
 +
'''2.1.''' Работа с gain будет добавлена в следующей итерации реализации автоэкспозиции, с сохранением баланса белого.
 +
 
 +
'''3.''' Было уменьшено время программирования регистров сенсора (практически в 10 раз - до ~80микросекунд) - стабильность программирования сенсора сохраняется при его частоте от ~15MHz - в fpcf добавлено ограничение на минимальную частоту сенсора в 20MHz.
 +
 
 +
'''4.''' Сам расчет экспозиции осуществляется в autoexp.c/hist_analyze() - в ближайшее время будет добавлена опция для autoexp_ctrl блокирования continuous режима работы автоэкспозиции.
 +
 
 +
'''4.1.''' В алгоритме была проведена оптимизация механизмов повышения и понижения экспозиции, чтобы не наблюдался резонанс, в связи с этим понижение экспозиции работает несколько медленнее, чем её повышение.
 +
 
 +
'''4.2.''' Алгоритм настроен так, что переэкспонированная сцена - при '''S > SQ''', недоэкспонированная - '''SQ < SQ/4''', и алгоритм стремится установить '''SQ >= S >= SQ/4''', - это сделано для избежания эффекта "иголки" - когда один небольшой яркий объект повергает всю сцену в мрак, где: '''SQ''' - максимально допустимое число переэкспонированных пикселей; '''S''' - число пикселей с значением 255 (сумма по всем цветам, чтобы не было искажений по балансу белого - т.е. считаем, что баланс белого выставлен корректно)
 +
 
 +
'''5.''' Из камеры доступен web-интерфейс управления автоэкспозицией (описание ожидается).
 +
 
 +
'''P.S.''' Вроде пока все.
 +
 
 +
 
 +
----
 +
 
 +
'''''01.01.2006:'''''
 +
 
 +
- Исправил баг с дребезжанием времени экспозиции в сценах, где значительную область занимает наиболее яркая равноосвещенная область (эквивалент можно получить открутив объектив от камеры - тогда на сенсор будет падать рассеянный свет, и практически все пиксели будут одинаково засвечены)
 +
 
 +
Это было достигнуто путем "установления ловушки" для такой "шапки" в гистограмме - при увеличении экспозиции раньше рассчет проводился на область 255 - при этом "шапка" попадала в эту область, сразу же получалось переэкспонирование значительно больше допустимой области, понижение экспозиции рассчитывалось с учетом ограничения в два раза - т.е. получалась положительная обратная связь, и система входила в резонанс.
 +
 
 +
Ловушка заключается в том, что теперь повышение экспозиции происходит не в рассчете на ''сумма пикселей значением 255 с новой экспозицией не меньше четверти допустимой области переэкспонирования'', а ''с новой экспозицией сумма пикселей с значением 254 и 255 не меньше четверти...'' - теперь при этом условии сцена считается экспонированной нормально. При этом экспозиция масштабируется не к значению 255, а 254 - в результате "шапка" при наличии останется в области 254 после увеличения экспозиции, где и будет находится до следующего изменения световой картины сцены.
  
Алгоритм весьма далек от идеального, т.к. дребезжит. Вот собственно цитата вопроса:
 
  
 
----
 
----
  
"Вы не знаете, где можно найти описание алгортимов, используемых для
+
'''''05.01.2006:'''''
автоэкспозиции?
+
 
Тот, который я сейчас реализовал, страдает "дребезжанием":
+
Внес изменения - сделал линейную чуствительность, и баланс синего/красного, плюс перенес гамма-таблицу в ядро, с поддержкой уровня черного и игнорированием уровня белого:
1. Если сцена недоэкспонирована, т.е. число пикселей с значением == 0
+
 
(или четверти допустимой пересвеченной площади), то ищем сверху индекс
+
Изменен ccam.cgi - добавлены параметры sens, rscale, bscale:
V, в котором число пикселей не равно нулю, и коэффициент умножения
+
 
будет K = V/254.0;
+
- sens - чуствительность сенсора, если сенсор 3Mp ревизии 0x01, то от 1 до 4 с шагом 1, если новой ревизии - то до 8 (аналоговое усиление сенсора)
2. Если сцена пересвечена, то K=SUM[число пикселей с значениями от
+
 
250(или 254) до 255]/[допустимая площадь пересвечивания], if(K < 0.5)
+
'? так вроде проверили -  до 16-ти можно в новой ревизии сенсора (chip ID=0x1621)?--[[User:Andrey.filippov|Andrey.filippov]] 01:13, 5 January 2006 (CST)'
K = 0.5;
+
 
3. Если число площади меньше области пересветки, и больше 0 (или
+
- rscale, bscale - соответственно плавное масштабирование красного и синего относительно зеленого (считается, что зеленый - всегда 1), коэффициенты в диапазоне от 0.5 до 2.0 включительно.
четверти области пересветки), то K=1.0
+
 
 +
Если новые параметры не используются, то все работает как и прежде, иначе параметры gg,gb,gr,ggb игнорируются.
 +
 
 +
На уровне взаимодействия с драйверами - параметры ioctl:
 +
 
 +
- P_GAMMA выставляет гамму, которая будет использоваться (используется набор 256-ти таблиц диапазона 0:0-255:255, которые пересчитываются с учетом уровня черного и масштабированием по каналам, если изменения необходимы)
 +
 
 +
- P_GAIN если меньше чем 0xFFF, то P_GAIN{R/G/B/GB} работает как и раньше, если больше или равен 0xFFF - используется чуствительность и масштабирование каналов в формате 8.8 fixed point
 +
 
 +
'? тоже непонятно - усиление 1.0 -> P_GAIN=0x100 < 0xFFF. Т.е сработает старый формат? Может быть определение надо было ставить по сравнениею с 0x100 (старые значения были в пределах до 63)? Или я что-то не понял?--[[User:Andrey.filippov|Andrey.filippov]] 01:13, 5 January 2006 (CST)'
 +
 
 +
- P_GAINGB - чуствительность сенсора: 0x0100 == 1, 0x0400 == 4 etc...
 +
 
 +
- P_GAINR, P_GAINB - соответственно масштабирование красного и синего относительно зеленого: 0x0100 == 1.0, 0x0080 == 0.5, 0x0200 == 2.0
 +
 
 +
Если значения выходят за предел допустимого, то они обрезаются по границе.
 +
 
 +
 
 +
TODO:
 +
 
 +
- получение верхней границы чуствительности сенсора.
  
В части 2 алгоритма все ок - если сцена пересвечена, то мы не знаем,
+
- масштабирование gain для понижения scale каналов.
на сколько можно опустить время экспозиции, главное - опустить, пока
 
не получится условие 1 или 3.
 
Но после этого в условии 1 используется неоптимальный алгоритм - в
 
результате, если большая часть сцены равномерно освещена, то
 
получается, что при оптимальной экспозиции область пересветки будет
 
больше небольшой площади пересветки, и в цикле идут шаги 1/2. Вы не в
 
курсе, как с таким можно бороться?"
 

Latest revision as of 13:12, 10 June 2007

in English | autotranslate | по-русски | 中文版

Выложил в CVS в camera333mjpeg автоэкспозицию - она запускается сразу же после старта камеры, и настраивается сразу же после первого кадра, полученного через web-интерфейс - т.е. самый первый кадр будет с настройками из web-интерфейса. Теперь поподробнее:

1. Автоэкспозиция рассчитывается в приложении apps/autoexp (в камере /usr/local/bin/autoexp), управляется (приведу описание без html, через командную строку) с помощью приложения autoexp_ctrl с такими параметрами:

-s отобразить текущие настройки автоэкспозиции.

-e включить автоэкспозицию.

-d отключить автоэкспозицию

-w, -h - ширина и высота окна рассчета автоэкспозиции (гистограммы), в процентах от изображения, получаемого с сенсора (т.е. изображения после сжатия)

-l, -t - смещение окна рассчета автоэкспозиции (гистограммы), в процентах. 0% - крайние левое и верхнее положение, 100% - крайние нижнее и правое положение, 50% - строго по центру.

-m - максимальное время экспозиции сенсора, которое может установить autoexp, в 0.1ms. (необходимо, чтобы в видеопотоке не падал fps)

-o - в процентах, максимально допустимое переэкспонированное число пикселей (не от всего изображения, а только от окна гистограммы), с точностью до 0.01%

1.1. Сразу же после запуска используются такие установки: - 100% ширина и высота окна гистограммы, максимальное значение экспозиции - 400ms, допустимое число пересвеченных пикселей - 0.5%.

1.2. autoexp после запуска не убивается.

2. Алгоритм автоэкспозиции на данный момент изменяет только время экспонирования сенсора, никак не влияя на настройки gain. При этом после первого получения изображения через web-интерфейс, работает постоянно (если включен), не зависимо от работы компрессора (сжатия FPGA). При этом все установки времени экспозиции "перетираются" временем, рассчитанным в apps/autoexp. Латентность каждого пересчета - 4 кадра (1-й - получение гистограммы и передача в autoexp, второй - изменение времени автоэкспозиции в сенсоре без его остановки, поэтому третий - пропуск кадра с искаженной гистограммой, и четвертый - вычисление корректной гистограммы после применения последнего изменения). В дальнейшем будет проведена оптимизация латентности.

2.1. Работа с gain будет добавлена в следующей итерации реализации автоэкспозиции, с сохранением баланса белого.

3. Было уменьшено время программирования регистров сенсора (практически в 10 раз - до ~80микросекунд) - стабильность программирования сенсора сохраняется при его частоте от ~15MHz - в fpcf добавлено ограничение на минимальную частоту сенсора в 20MHz.

4. Сам расчет экспозиции осуществляется в autoexp.c/hist_analyze() - в ближайшее время будет добавлена опция для autoexp_ctrl блокирования continuous режима работы автоэкспозиции.

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

4.2. Алгоритм настроен так, что переэкспонированная сцена - при S > SQ, недоэкспонированная - SQ < SQ/4, и алгоритм стремится установить SQ >= S >= SQ/4, - это сделано для избежания эффекта "иголки" - когда один небольшой яркий объект повергает всю сцену в мрак, где: SQ - максимально допустимое число переэкспонированных пикселей; S - число пикселей с значением 255 (сумма по всем цветам, чтобы не было искажений по балансу белого - т.е. считаем, что баланс белого выставлен корректно)

5. Из камеры доступен web-интерфейс управления автоэкспозицией (описание ожидается).

P.S. Вроде пока все.



01.01.2006:

- Исправил баг с дребезжанием времени экспозиции в сценах, где значительную область занимает наиболее яркая равноосвещенная область (эквивалент можно получить открутив объектив от камеры - тогда на сенсор будет падать рассеянный свет, и практически все пиксели будут одинаково засвечены)

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

Ловушка заключается в том, что теперь повышение экспозиции происходит не в рассчете на сумма пикселей значением 255 с новой экспозицией не меньше четверти допустимой области переэкспонирования, а с новой экспозицией сумма пикселей с значением 254 и 255 не меньше четверти... - теперь при этом условии сцена считается экспонированной нормально. При этом экспозиция масштабируется не к значению 255, а 254 - в результате "шапка" при наличии останется в области 254 после увеличения экспозиции, где и будет находится до следующего изменения световой картины сцены.



05.01.2006:

Внес изменения - сделал линейную чуствительность, и баланс синего/красного, плюс перенес гамма-таблицу в ядро, с поддержкой уровня черного и игнорированием уровня белого:

Изменен ccam.cgi - добавлены параметры sens, rscale, bscale:

- sens - чуствительность сенсора, если сенсор 3Mp ревизии 0x01, то от 1 до 4 с шагом 1, если новой ревизии - то до 8 (аналоговое усиление сенсора)

'? так вроде проверили - до 16-ти можно в новой ревизии сенсора (chip ID=0x1621)?--Andrey.filippov 01:13, 5 January 2006 (CST)'

- rscale, bscale - соответственно плавное масштабирование красного и синего относительно зеленого (считается, что зеленый - всегда 1), коэффициенты в диапазоне от 0.5 до 2.0 включительно.

Если новые параметры не используются, то все работает как и прежде, иначе параметры gg,gb,gr,ggb игнорируются.

На уровне взаимодействия с драйверами - параметры ioctl:

- P_GAMMA выставляет гамму, которая будет использоваться (используется набор 256-ти таблиц диапазона 0:0-255:255, которые пересчитываются с учетом уровня черного и масштабированием по каналам, если изменения необходимы)

- P_GAIN если меньше чем 0xFFF, то P_GAIN{R/G/B/GB} работает как и раньше, если больше или равен 0xFFF - используется чуствительность и масштабирование каналов в формате 8.8 fixed point

'? тоже непонятно - усиление 1.0 -> P_GAIN=0x100 < 0xFFF. Т.е сработает старый формат? Может быть определение надо было ставить по сравнениею с 0x100 (старые значения были в пределах до 63)? Или я что-то не понял?--Andrey.filippov 01:13, 5 January 2006 (CST)'

- P_GAINGB - чуствительность сенсора: 0x0100 == 1, 0x0400 == 4 etc...

- P_GAINR, P_GAINB - соответственно масштабирование красного и синего относительно зеленого: 0x0100 == 1.0, 0x0080 == 0.5, 0x0200 == 2.0

Если значения выходят за предел допустимого, то они обрезаются по границе.


TODO:

- получение верхней границы чуствительности сенсора.

- масштабирование gain для понижения scale каналов.