EMVA 1288标准之GemICam-GenApi学习与解读
背景介绍
当前相机不仅用于传输图像,还打包了越来越多的功能。这就导致相机的编程接口越来越复杂。
GenICam的目标是为所有类型的相机提供一个通用的编程接口,无论相机使用何种接口技术,或者实现了什么样的特性,它们的编程接口都应该相同。
根据要解决的主要任务不同,GenICam标准包含多个模块:
- GenApi:用于对相机进行配置的应用程序编程接口(API)。
- GenTL:支持抓取图像的传输层(transport layer, TL)API。
- SFNC:标准特性的命名约定。
- CLProtocol:用于将Camera Link相机转接到GenAPI的API。
- GenCP:通用控制协议。
各个模块可以独立于其他模块进行发布。
GenApi模块简介
GenApi模块主要解决如何配置相机的问题。主要思想是,相机供应商提供camera description files,这些文件包含将相机特性自动化映射为相机寄存器的信息。
例如:用户想要设置相机增益Gain=42
。使用GenICam的通用软件将自动读取相机的描述文件,然后搞清楚将Gain
设置为42,意思是将0x2A
这个值写入到地址为0x0815
的寄存器上。其他可能涉及到的工作可能是提前检查相机是否具备增益属性以及检查新值是否在允许的增益范围。
为相机新增属性仅仅只需要扩展相机描述文件,就可使新特性在GenICam应用下立即可用。
上图展示配置相机时涉及到的层。应用想要设置相机属性,只需要编写类似下面这样的代码:
Camera.Gain = 42;
GenApi模块会将这个调用转换为一系列transport layer API
的调用,这些API主要用于寄存器存取,类似下面这样的代码:
TransportLayer.WriteRegister( 0x0815, 0x2A, 2 ); // address, data, length
最后,transport layer将会把这些调用传递给相机接口。目前,GenApi假定相机属性和寄存器地址一一对应,不会多个属性共用同一个寄存器。
GenICam标准定义了相机描述文件的语法以及transport layer API的语义。并且为各个相机属性定义了推荐的名字和类型。GenICam标准不包含实际解析描述文件的代码,也不包含transport layer代码。任何人都可以自定义其实现(GenICam有一个可以免费使用的参考实现)。
GenApi部分仅处理相机描述文件,意图帮助用户理解GenApi的关键设计思想,并帮助用户编写他们自己的相机描述文件。