GenICam. Почему стоит посвятить несколько часов изучению стандарта?
Введение
В настоящее время работа с камерами машинного зрения происходит путем считывания и записи их параметров с помощью регистров камеры. Однако для различных камер и производителей адреса регистров, соответвующих одному и том же параметру различны. В связи с этим возникла необходимость унификации интерфейса взаимодействия между камерой и компьютером.
Такой стандартный интерфейс носит название GenICam (Generic Interface for Cameras). Его поддерживает и разрабатывает Европейская Ассоциация Машинного Зрения (EMVA).
Большинство современных камер, построенных на технологиях USB3 , GigE Vision, Camera Link поддерживают данный стандарт.
Что такое GenICam?
GenICam — это стандартный интерфейс для программирования взаимодействия с промышленными камерами машинного зрения. В памяти камеры записан файл-дескриптор в формате xml, хранящий карту регистров параметров камеры. По этой карте программа получает адреса регистров в памяти камеры, в которых лежат ее параметры. Примерами таких параметров являются подолжительность экспозиции, область интереса, коэффиициент усиления.
Кто поддерживает GenICam?

Таблица 1: Список производителей камер, учавствующих на встречах, проводимых по стандарту GenICam.
Все современные камеры, основанные на GigE Vision и USB 3.0 должны поддерживать интерфейс GenICam.
Из приведенных в таблице 1 данных можно сделать вывод, что количество производителей камер, поддерживающих данный стандарт, значительно увеличилось с момента его появления и, скорее всего, будет только расти. Полный список членов EMVA можно найти здесь.
Резюме по первой части
Основная идея работы с данным стандартом состоит в унификации интерфейса работы с камерами: разработав интерфейс для работы с камерой Basler, в идеале не нужны правки для подключения Stemmer.
Примеры
Разберем некоторые основные параметры камеры, записанные в xml-файле.
В каждом файле есть название модели, компании-производителя, а также описание версии стандарта GenICam, в соответствии с которым создавался этот файл:
xmlns="http://www.genicam.org/GenApi/Version_1_1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.genicam.org/GenApi/Version_1_1 http://www.genicam.org/GenApi/GenApiSchema_Version_1_1.xsd">Далее приводится список параметров, оформленных тегом <pFeature>.
<Group Comment="Root">
<Category Name="Root">
<pFeature>Bootstrap</pFeature>
<pFeature>SupportGroup</pFeature>
<pFeature>GenICamGroup</pFeature>
<pFeature>CoaXPressGroup</pFeature>
<pFeature>AcquisitionControls</pFeature>
<pFeature>CameraInformation</pFeature>
<pFeature>ROI</pFeature>
<pFeature>ExposureControl</pFeature>
<pFeature>AutoExposureControl</pFeature>
<pFeature>TriggerControl</pFeature>
<pFeature>GainAndOffset</pFeature>
<pFeature>ColorBalance</pFeature>
<pFeature>LookUpTable</pFeature>
<pFeature>MiscellaneousControl</pFeature>
<pFeature>ImageZones</pFeature>
<pFeature>ImageCorrection</pFeature>
<pFeature>LensControl</pFeature>
<pFeature>LensStatus</pFeature>
<pFeature>UserSets</pFeature>
<pFeature>TLParamsLockedCategory</pFeature>
</Category>Рассмотрим некоторые из них, а так же влияние на получаемое изображение:
<Group Comment="ROI">
<Category Name="ROI">
<ToolTip>Region of Interest Control</ToolTip>
<pFeature>ROI_HR</pFeature>
<pFeature>ROI_1_HR_Start</pFeature>
<pFeature>ROI_1_VR</pFeature>
<pFeature>ROI_1_VR_Start</pFeature>
<pFeature>ROI_Set_Windows</pFeature>
</Category>В данном участке файла хранится описание области интереса. Она задается четырьмя числами: координатами правого верхнего угла (Roi_1_HR_Start, Roi_1_VR_Start), а также высотой и шириной прямоугольника (Roi_1_HR, Roi_1_VR).
Содержание регистра:
<Integer Name="ROI_1_VR_Start">
<ToolTip>Starting row of the first ROI window</ToolTip>
<Description>Starting row of the first ROI window</Description>
<Streamable>Yes</Streamable>
<pValue>ROI_1_VR_StartReg</pValue>
<Min>1</Min>
<pMax>MaxHeight</pMax>
<Inc>4</Inc>
<Representation>Linear</Representation>
</Integer>
<IntReg Name="ROI_1_VR_StartReg">
<Visibility>Invisible</Visibility>
<Address>0x40000010</Address>
<Length>4</Length>
<AccessMode>RW</AccessMode>
<pPort>Device</pPort>
<Cachable>NoCache</Cachable>
<Sign>Unsigned</Sign>
<Endianess>BigEndian</Endianess>
</IntReg>При установке значений области интереса, вызывается команда:
<Command Name="ROI_Set_Windows">
<ToolTip>Apply ROI window settings</ToolTip>
<Description>Apply ROI window settings</Description>
<pValue>ROI_Set_WindowsReg</pValue>
<CommandValue>1</CommandValue>
</Command>
<IntReg Name="ROI_Set_WindowsReg">
<Visibility>Invisible</Visibility>
<Address>0x41000014</Address>
<Length>4</Length>
<AccessMode>WO</AccessMode>
<pPort>Device</pPort>
<Cachable>WriteThrough</Cachable>
<Sign>Unsigned</Sign>
<Endianess>BigEndian</Endianess>
</IntReg>Как мы видим, регистр команды имеет доступ только для записи (<AccessMode>WO</AccessMode>). При записи единицы в регистр (<CommandValue>1</CommandValue>) по адресу (<Address>0x41000014</Address>), камера считывает установленные данные и изменяет соответствующие параметры.
Ниже приведен пример зарегистрированных изображений для камер с одинаковым значением фокусного расстояния (зумом), но различными значениями областей интереса.
Разрешение центральной картинки в 4 раза меньше разрешения правой картинки.

Рисунок 1. Влияние различных значений регистров РОИ на изображения. Левая картинка — выбранная область интереса для камеры 3. Центральная картинка — изображение полученное с камеры (Cam_3) после установки области интереса. Правая картинка — изображение полученное с аналогичной камеры (Cam_4), при максимально возможной области интереса.
При недостаточном освещении или коротком времени выдержки экспозиции изображения получаются затемненными. Одним из стандартных решений является умножение каждого пикселя на константное число. Вместо того, чтобы делать эти процедуры на ПК, можно записать значения умножения в регистры внутри камеры и сразу получать с нее уже отредактированное изображение.
Рассмотрим данный параметр:
<Enumeration Name="AnalogGain">
<ToolTip>Analog gain</ToolTip>
<Description>Analog gain</Description>
<Streamable>Yes</Streamable>
<EnumEntry Name="x1">
<Description>x1</Description>
<Value>0</Value>
</EnumEntry>
<EnumEntry Name="x2">
<Description>x2</Description>
<Value>1</Value>
</EnumEntry>
<EnumEntry Name="x3">
<Description>x3</Description>
<Value>2</Value>
</EnumEntry>
<pValue>AnalogGainReg</pValue>
</Enumeration>
<IntReg Name="AnalogGainReg">
<Visibility>Invisible</Visibility>
<Address>0x40000040</Address>
<Length>4</Length>
<AccessMode>RW</AccessMode>
<pPort>Device</pPort>
<Cachable>NoCache</Cachable>
<Sign>Unsigned</Sign>
<Endianess>BigEndian</Endianess>
</IntReg>
Видим, что данный параметр имеет три различных значения: х1, х2, х3. Причем в xml-файле также записаны актуальные значения, хранящиеся в соответствующем регистре камеры (по умолчанию они могут быть различны. Например, для различных производителей камер вместо <Value>0</Value> стоит <Value>1</Value>, однако стандартизация интерфейса помогает избежать путаницы и не думать об этих значениях).

Рисунок 2. Сравнение различных изображений, полученных в одинаковых условиях, но с различными значениями умножения напряжения (gain).
Есть два различных способа умножения: аналоговое и цифровое. Аналоговое умножение умножает напряжение на 1, 2 или 3. В то время как цифровое умножает значение каждого пикселя на заданное флотовое значение.
Также удобной является возможность производить калибровку цветов непосредственно в камере. При различном освещении, белый цвет может “плыть” в сторону синего, зеленого и красного. Из личного опыта работы на зеленом фоне, а так же работе со структурированной подсветкой, могу сказать, что цветовая калибровка является важным этапом настройки камер.
<Group Comment="ColorBalance">
<Category Name="ColorBalance">
<ToolTip>Tracking and Auto White Balance Control</ToolTip>
<pFeature>RedMultiplier</pFeature>
<pFeature>BlueMultiplier</pFeature>
<pFeature>TrackingEnable</pFeature>
<pFeature>TWBSpeed</pFeature>
<pFeature>AWBCalc</pFeature>
</Category>
<Integer Name="RedMultiplier">
<ToolTip>Fixed point multiplier equals value divided by 1024</ToolTip>
<Description>Red color plane multiplier</Description>
<Streamable>Yes</Streamable>
<pValue>RedMultiplierReg</pValue>
<Min>0</Min>
<Max>0xFFF</Max>
<Inc>1</Inc>
<Representation>Linear</Representation>
</Integer>
<IntReg Name="RedMultiplierReg">
<Visibility>Invisible</Visibility>
<Address>0x4000008C</Address>
<Length>4</Length>
<AccessMode>RW</AccessMode>
<pPort>Device</pPort>
<Cachable>NoCache</Cachable>
<Sign>Unsigned</Sign>
<Endianess>BigEndian</Endianess>
</IntReg>
<Integer Name="BlueMultiplier">
<ToolTip>Fixed point multiplier equals value divided by 1024</ToolTip>
<Description>Blue color plane multiplier</Description>
<Streamable>Yes</Streamable>
<pValue>BlueMultiplierReg</pValue>
<Min>0</Min>
<Max>0xFFF</Max>
<Inc>1</Inc>
<Representation>Linear</Representation>
</Integer>
<IntReg Name="BlueMultiplierReg">
<Visibility>Invisible</Visibility>
<Address>0x40000090</Address>
<Length>4</Length>
<AccessMode>RW</AccessMode>
<pPort>Device</pPort>
<Cachable>NoCache</Cachable>
<Sign>Unsigned</Sign>
<Endianess>BigEndian</Endianess>
</IntReg>Для установки цветового баланса вручную, значения записываются в соответствующие регистры. Важно отметить, что для каждого регистра есть как минимальное значение 0, так и максимальное 0xFFF. При попытке установить значения вне диапазона срабатывает программное исключение.
Цветовая калибровка “плывет” (см рисунок 3) из-за того, что по умолчанию ( Value = 1 ) камера старается подобрать коэффициенты усиления цветов так, чтобы “средний цвет” был белым (серым), используя все изображения.
Доступные варианты цветовой калибровки так же записаны в соответствующих регистрах:
<Enumeration Name="TrackingEnable">
<ToolTip>Tracking White Balance Enable</ToolTip>
<Description>Tracking White Balance Enable</Description>
<Streamable>Yes</Streamable>
<EnumEntry Name="Disabled">
<Description>Disabled</Description>
<Value>0</Value>
</EnumEntry>
<EnumEntry Name="Enabled_Using_Full_Image">
<Description>Enabled Using Full Image</Description>
<Value>1</Value>
</EnumEntry>
<EnumEntry Name="Enabled_Using_Zones">
<Description>Enabled Using Zones</Description>
<Value>2</Value>
</EnumEntry>
<pValue>TWBEnableReg</pValue>
</Enumeration>
<IntReg Name="TWBEnableReg">
<Visibility>Invisible</Visibility>
<Address>0x40000084</Address>
<Length>4</Length>
<AccessMode>RW</AccessMode>
<pPort>Device</pPort>
<Cachable>WriteThrough</Cachable>
<Sign>Unsigned</Sign>
<Endianess>BigEndian</Endianess>
</IntReg>
Рисунок 3. Отклонение цветового баланса в синюю и красную область.
Заключение
Как видно из приведенных примеров, GenIСam имеет относительно удобный, и что самое главное — стандартный интерфейс, по которому можно устанавливать параметры регистрации изображений.