GenICam标准(二)

在这里插入图片描述

系列文章目录


GenICam标准(一)
GenICam标准(二)
GenICam标准(三)
GenICam标准(四)
GenICam标准(五)
GenICam标准(六)


文章目录

  • 系列文章目录
  • 1、简介
  • 2、照相机描述文件的基本结构
  • 3、节点、接口和抽象特征
  • 4、获取和设置值
  • 5、访问模式
  • 参考


1、简介

    GenApi 模块解决如何去配置相机的问题。主要的思路是,让相机生产厂商为他们的相机提供机器可以识别的产品说明。这些相机描述文件(camera description files)包含所有需要的信息,用以自动地把相机的属性(features)和其寄存器(registers)相对应。

    相机的 Gain 属性是一个典型的例子,假设用户想令 Gain=42 ,利用 GenICam ,通用的软件可以读相机的描述文件并发现,要把 Gain 属性设成 42 意味着向地址为 0x0815 的寄存器写入值 0x2A 。其他要做的工作可能是检查相机是否提供 Gain 属性,并检查要写入的值是否在 Gain 的允许范围内。

    请注意,给相机添加新的属性仅仅意味着扩展相机的描述文件,就可以对所有符合 GenICam 标准的程序立即生效。

在这里插入图片描述

    图 2 显示了配置照相机所涉及的图层。

    请注意,本文档中的 GenApi 部分只处理照相机描述文件。它旨在帮助 GenICam 用户理解 GenApi 模块背后的关键思想,并使人们能够编写他们自己的相机描述文件。GenApi 参考实现附带了一个参考手册,展示了最终用户如何使用 GenApi 模块,即使不深入了解本节中介绍的概念。

2、照相机描述文件的基本结构

    该摄像机是通过在一个包含一组节点的 XML 文件上进行描述的,每个节点都有一个类型和一个唯一的名称。节点可以相互链接,每个连接都起着一定的作用。图 3 显示了一个非常简单的图形符号示例。节点显示为标记为 “type::name” 的气泡标签,链接显示为标记为角色名称的箭头。

    有两个特殊的节点:

  • 根节点,可以遍历节点图
  • 设备节点,提供到传输层连接。

在这里插入图片描述
图 3 由一个简单的配置文件构造而成的图的拓扑结构

    图 3 中的增益节点(Gain)为 IntReg 类型,它允许从寄存器中提取一个整数。从根节点上看,这是照相机的一个特性。因此,根节点包含一个名为 pFeature 的链接,它引用了增益节点(Gain)。要读取和写入增益寄存器,增益节点需要访问照相机端口,因此它包含一个到设备节点的链接。该链接被命名为 pPort ,并引用了设备节点。

    增益节点(Gain)包含在大端模式下提取两个字节无符号整数所需的所有信息。完整的相机描述文件如下:

<?xml version="1.0" encoding="utf-8"?>
<RegisterDescription 
	ModelName="Example01" 
	VendorName="Test" 
	ToolTip="Example 01 from the GenApi standard" 
	StandardNameSpace="None" 
	SchemaMajorVersion="1" 
	SchemaMinorVersion="1" 
	SchemaSubMinorVersion="0" 
	MajorVersion="1" 
	MinorVersion="0" 
	SubMinorVersion="0" 
	ProductGuid="1F3C6A72-7842-4edd-9130-E2E90A2058BA" 
	VersionGuid="7645D2A1-A41E-4ac6-B486-1531FB7BECE6" 
	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">
	 
	<Category Name="Root">
		<ToolTip>Entry for traversing the node graph</ToolTip>
		<pFeature>Gain</pFeature>
	</Category>
	
	<IntReg Name="Gain">
		<ToolTip>Access node for the camera's Gain feature</ToolTip>
		<Address>0x0815</Address>
		<Length>2</Length>
		<AccessMode>RW</AccessMode>
		<pPort>Device</pPort>
		<Sign>Unsigned</Sign>
		<Endianess>BigEndian</Endianess>
	</IntReg>
	
	<Port Name="Device">
		<ToolTip> Port node giving access to the camera</ToolTip>
	</Port>
</RegisterDescription>

    <?xml> 节点是一个处理元素,提供有关文件编码的提示,并且总是这样的。

    <RegisterDescription> 元素是封装摄像机所有节点的最外层括号。相机由模型名称(ModelName)和 VenderName 属性标识标识。

    每个节点都有一个可选的 <ToolTip> 元素,其中包含一个简短的描述。增益节点(Gain)有一些依赖于其 IntReg 类型的附加元素,并告诉我们,例如,寄存器的地址或它的长度。其默认值为空字符串。

    通常,一个实现将为每个节点创建一个软件对象,并根据 XML 文件中描述的逻辑链接将这些对象链接在一起。这些节点既可以通过它们的(唯一的)名称来检索,也可以通过从根节点开始遍历节点图来找到。一旦用户有了一个指向节点的指针,他就可以通过节点对象的编程接口访问该特性。

    XML 文件的语法是在由模式位置属性给出的 XML 模式中定义的。该模式是该标准的一部分。本文解释了 GenICam 的思想和总体结构。模式及其嵌入的参考文档描述了正式的细节。如果有疑问,模式的内容将覆盖此文本的内容。

    文件位置 http://www.genicam.org/GenApi/GenApiSchema_Version_1_1.xsd 对于相机配置文件是必需的,但可以在运行时被重写。

3、节点、接口和抽象特征

Nodes, Interfaces, and Abstract Features

    相机描述文件中的每个节点只描述一个项目。基于项目的自然性,节点有一个特定的类型(node type)和一个特定的接口(interface)。目前可用的接口(interfaces)如下(每个接口有一个控件用于映射到 GUI):

  • IInteger —— 映射到一个带有 value、min、max 和 increment 的滑动条(slider)

  • IFloat —— 映射到一个带有 value、min、max 和一个物理单位的滑动条(slider)

  • IString —— 映射到一个显示字符串的编辑框

  • IEnumeration —— 映射到一个下拉框

  • ICommand —— 映射到一个命令按钮

  • IBoolean —— 映射到一个复选框(check box)

  • IRegister —— 映射到一个显示 16 进制字符串的编辑框

  • ICategory —— 映射到一个可以反映相机属性结构的树控件

  • IPort —— 映射到一个相机端口,通常不用图形显示

    第 2.9 节给出了接口特性的更多细节。可用的节点类型在第 2.8 节中说明。可能有多种节点类型实现同样的接口类型。例如,IInteger 接口,被下列(不是全部)节点类型实现:

  • IntReg —— 根据字节边界,从寄存器取出一个整数

  • MaskedIntReg —— 从寄存器的一段取出一个整数,例如,从第 8 位到第 12 位

  • Integer —— 从不同的节点得到 value、min、max 和 increment 属性,合并在一起

    每个节点类型从不同的源,用不同的方法取出一个整数值。对于需要输入一个整数值的连接,所有这些节点的输出值都可以用作类型安全的输入。

    抽象特征(Abstract features)总是用接口类型(interface type)、名称(name)和含义(meaning)来描述。例如,相机的 Gain(名称)可以被定义为 IInteger(接口类型),并且可以描述相机内的增益(含义)。注意,其它的定义也可能存在,例如,Gain 可以被定义为一个 IEnumeration 或一个 IFloat 。

4、获取和设置值

Getting and Setting Values

    当用户读或写一个节点的值,节点会触发节点图内一系列的读写操作。为了说明这一点,图 4 显示了 Gain 属性的一个更复杂的例子。Gain 属性可以抽象成一个 IInteger 接口,通过这个接口,用户可以设置 Value 并且可以读(或其它操作)Min 和 Max 值。图 4 的例子假定相机有 3 个寄存器,一个是 Gain 的 Value ,另两个是 Min 和 Max 。利用 IntReg 节点可以从每个寄存器取出相应的值。名字为 Gain 的 Integer 节点收集并合并这些数据,再通过 IInteger 接口把结果传递出来。

在这里插入图片描述
图 4:获取和设置功能时的控制流示例

...
	 
	<Category Name="Root">
		<ToolTip>Entry for traversing the node graph</ToolTip>
		<pFeature>Gain</pFeature>
	</Category>
	
	<IntReg Name="Gain">
		<ToolTip>Access node for the camera's Gain feature</ToolTip>
		<Address>0x0815</Address>
		<Length>2</Length>
		<AccessMode>RW</AccessMode>
		<pPort>Device</pPort>
		<Sign>Unsigned</Sign>
		<Endianess>BigEndian</Endianess>
		<pValue>GainValue</pValue>
	    <pMin>GainMin</pMin>
	    <pMax>GainMax</pMax>
	</IntReg>
	
	<Port Name="Device">
		<ToolTip> Port node giving access to the camera</ToolTip>
	</Port>
...

    如果用户读取 Gain 节点的值,调用会被分派到 GainValue 节点,而 GainValue 节点会通过 IPort 接口向 Device 节点查询正确的寄存器。

    如果用户试图设置 Gain 节点的值,实现程序可能首先会从 GainMin 和 GainMax 节点读出 Min 和 Max 值以检查范围。如果输入值在允许的范围内,Gain 节点会通过 GainValue 节点和 Device 节点把值写入相机。注意,根据相应 IntReg 节点的 Cacheable 属性,实现程序可能会把 Min 和 Max 值放入缓存。

5、访问模式

Access Mode

每个节点都有一个下表定义的访问模式:

ReadableWritableImplementedAccess Mode
0NI – 未实现
001NA – 不可用
011WO – 只写
101RO – 只读
111RW – 读写

    1 = yes, 0 = no, * = don’t care

    属性可能已经被相机实现,但暂时不可用。如果可用,则根据定义,属性被实现并且可以读和/或写。

    有些节点由某些元素来控制访问权限,例如寄存器节点(参见 2.8.3)。另外,GenICam 还提供 3 种在运行时改变访问权限的机制。

  • 根据另一个节点的值,属性可能暂时被锁定(locked)。属性在锁定的状态下不可写。根据上面的表格,写标志位暂时强制为 0 。

  • 根据另一个节点的值,属性可能暂时不可用(not available)。根据上面的表格,写标志位和读标志位暂时强制为 0 。

  • 根据另一个节点的值,属性可能没有实现(not implemented)。根据上面的表格,实现标志位始终强制为 0 。

    “可用” 和 “已实现” 是不同的,因为 GUI 可能想用不同的方法来处理这两种情况。未实现的属性不会显示给用户;而暂时不可用的项目只是灰色的并且值会被替换,例如替换成 “—” ;暂时被锁定的属性是灰色的,但是属性的值仍然会显示。

    以硬件 Trigger 为例来说明让一个属性暂时不可用(temporarily not available)的情况,硬件 Trigger 的值可以为 On 或 Off 。如果 Trigger 是 On ,另外一个属性 TriggerPolarity(触发极性) 变得可用,TriggerPolarity 属性指示硬件信号是 ActiveHigh 还是 ActiveLow 。如果 Trigger 是 Off,则 TriggerPolarity 属性是无意义的,应该被置为灰色。

    图 5 显示了这个信息在相机描述文件中如何处理,Trigger 和 TriggerPolarity 属性用 Enumeration 类型的节点来实现,这种类型把一组枚举型的入口映射到整数值。例如,Trigger 属性的入口是 On=1 和 Off=0 。利用 IntReg 类型的节点把整数值映射到寄存器。

在这里插入图片描述
    图 5 控制一个特性是否可访问

    TriggerPolarity 节点有个叫 pIsAvailable 的连接,这个连接需要指向一个提供 IInteger 接口的节点。如果这个被指向的节点的值为 0 ,那么 TriggerPolarity 节点暂时不可访问。

    在这个例子中,pIsAvailable 可以直接指向 TriggerReg,因为 Trigger=On 被映射为 1,Trigger=Off 被映射为 0 。如果不是这样的话,一个类型为 IntSwissKnife 的节点会很有用,它能根据数学公式计算其他整数节点的值,并得到一个整数的结果。在 XML 文件中,节点看起来像这个样子:

<IntSwissKnife Name="TriggerEnabled">
	<ToolTip>Determines if the Trigger feature is switched on</ToolTip>
	<pVariable Name="TRIGGER">TriggerReg</pVariable>
	<Formula>TRIGGER==1</Formula>
</IntSwissKnife>

    <Formula> 入口的数学公式被计算,得到节点的计算结果。在计算之前,变量的符号名称被对应节点的整数值替换。在本例中,只有一个 <pVariable> 入口指向 TriggerReg 节点,符号名称是 TRIGGER 。这个名称在公式 “TRIGGER==1” 中也有。

    如果 GUI 升级了,就会去查看 TriggerPolarity 节点是否可用。而 TriggerPolarity 节点会去检查 IntSwissKnife,而 IntSwissKnife 又会根据 TriggerReg 节点的值去计算结果。

    兼容 DCAM 的 1394 相机的 BytesPerPacket 属性是 “暂时锁定属性”( temporarily locked)的一个典型例子。用户可以改变相机的这个参数,仅当 PC 适配器的 DMA 未被设定为采集图像的时候。设定 DMA 的意思是,传输层查询相机的 BytesPerPacket 参数,并把这个参数设置到 DMA 。这个工作完成后,直到传输层释放 DMA 之后才能改变 BytesPerPacket 。在这之前,相机的这个参数必须被锁定。

    注意,相机本身没有办法知道 DMA 是否设置。因此,相机描述文件中 “普通的” 节点不能被用来控制 BytesPerPacket 的锁定状态。

在这里插入图片描述
    图 6 正在锁定一个特征

    GenApi 内的解决方案是提供一个浮动的 Boolean 型节点 TLParamsLocked(参见图 6)。BytesPerPacket 通过 pIsLocked 连接到这个节点。传输层(TL)需要通过更新 TLParasLocked 节点的值来反映其 DMA 状态。在设定 DMA 之前,它会通过令 TLParamsLocked 为 true 的方式来锁定相机参数(例如 BytesPerPacket ),在采集图像完成之后,它会把 TLParamsLocked 设置回 false 。改变 TLParamsLocked 节点会更新所有关联节点的锁定状态,例如 BytesPerPacket 节点。

    注意,为保证这种方式正常工作,TLParamsLocked 必须是标准的节点名,并且传输层必须有访问相机的 GenApi 接口的权限。另外,相机描述文件的设计者必须注意哪个参数要被传输层锁定。这个信息包含在传输层标准之中,例如 DCAM 规范,这个规范规定,在采集数据的时候每桢的包数和每个包的大小必须固定。

    “属性没有被实现”( not implemented)的一个典型的例子是,同一个家族的某些相机有 Gamma 属性而有些则没有。如果相机有一个查询位(inquiry bit)来标识是否实现了 Gamma 属性,就可以为这个家族的所有相机维护一个相机描述文件。

    图 7 显示了 GenICam 如何处理这种情况。Gamma 属性节点有一个叫 pIsImplemented 的连接指向 GammaInq 节点,GammaInq 节点映射相机的查询位。通常把多个查询位合并到一个寄存器里。为了取得这些位,要使用 MaskedIntReg 节点类型。这个类型有点像 IntReg 节点,但是,你可以像查询整数一样取查询想要的一个或一组连续的位。

在这里插入图片描述
图 7 检查是否实现了一个功能

参考

GenIcam标准(一)
GenIcam标准(二)
GenIcam标准(三)
GenIcam标准(四)
GenIcam标准(五)
GenIcam标准(六)

GenIcam标准介绍


GenIcam标准(一)
GenIcam标准(二)
GenIcam标准(三)
GenIcam标准(四)
GenIcam标准(五)
GenIcam标准(六)

   
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/717576.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【蜂窝物联】物联网智能控制器助力各种自动化控制领域科学管控

【蜂窝物联】4G远程温湿度传感器科学管理利器&#xff0c;应用无处不在 2024-06-17 14:09 发布于&#xff1a;福建省 随着信息化的不断推进&#xff0c;对各行各业都是一次现代化升级的契机&#xff0c;比如工厂的温湿度监测工作&#xff0c;完全可以由无线温湿度监控方案…

【Spine学习10】之 创建新骨骼时,自动绑定图片和插槽的快捷方式

两天没更新了。 遇到一些难解的难题 用的版本是破解版 不知道为啥现在的教程非常地快 明明有些细节很重要还略过讲 所以创建骨骼这里 基本创建是都会 可是骨骼一多 实际工作中的重命名也太麻烦了 。 这就需要学习快捷创建方式&#xff1a; <将对应图片自动绑定到新骨骼上并…

Vue55-TodoList案例-本地存储

一、TodoList案例-本地存储 此时&#xff0c;修改对象里面的属性&#xff0c;watch监视不到&#xff01; 需要深度监视&#xff0c;就不能用简写形式&#xff01; 二、jeecg-boot中的本地存储 jeecg-boot中&#xff0c;浏览器的本地存储&#xff0c;存储的是token&#xff01;…

TC3xx A\B SWAP机制的小细节(1)

目录 1.汽车OTA背景 1.1 汽车为什么需要OTA 1.2 汽车OTA概念 2. MCU的硬件A\B Swap机制 3.小结 1.汽车OTA背景 1.1 汽车为什么需要OTA 谈到英飞凌TC3xx的A\B SWAP硬件机制&#xff0c;我们首先要搞懂它的应用场景--OTA。 在手机或者电脑上&#xff0c;我们几乎每天都可…

JavaEE进阶----SpringBoot快速入门

文章目录 前言一、了解Maven1.1 Maven功能- 项⽬构建- 管理依赖 1.2Maven仓库 二、第一个SpringBoot项目总结 前言 Spring Boot是一个用于构建快速、简单和可扩展的生产级应用程序的框架。它基于Spring框架&#xff0c;提供了开发微服务和独立的应用程序所需的一切。 一、了解…

一、开发环境安装 Avalonia

1、概述 官网中是这么介绍Avalonia的&#xff0c;Avalonia是一个强大的框架&#xff0c;使开发人员能够使用.NET创建跨平台应用程序。它使用自己的渲染引擎绘制UI控件&#xff0c;确保在Windows、macOS、Linux、Android、iOS和WebAssembly等不同平台上具有一致的外观和行为。这…

2024年8款最受欢迎的开源看板系统

开源看板系统有哪些&#xff1f;本文将盘点国内外主流的8款看板系统&#xff1a;PingCode、Kanboard、Worktile、Wekan、OpenProject、TAIga、Focalboard。 今天想和大家探讨的是开源看板系统。作为一个热衷于项目管理和效率提升的爱好者&#xff0c;我在这方面也是小有研究。开…

基于DPU的云原生裸金属服务快速部署及存储解决方案

1. 背景介绍 1.1. 业务背景 在云原生技术迅速发展的当下&#xff0c;容器技术因其轻量级、可移植性和快速部署的特性而成为应用部署的主流选择&#xff0c;但裸金属服务器依然有其独特的价值和应用场景&#xff0c;是云原生架构中不可或缺的一部分。 裸金属服务器是一种高级…

抛光粉尘可爆性检测 打磨粉尘喷砂粉尘爆炸下限测试

抛光粉尘可爆性检测 抛光粉尘的可爆性检测是一种安全性能测试&#xff0c;用于确定加工过程中产生的粉尘在特定条件下是否会爆炸&#xff0c;从而对生产安全构成威胁。如果粉尘具有可爆性&#xff0c;那么在生产环境中就需要采取相应的防爆措施。粉尘爆炸的条件通常包括粉尘本身…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 字符串筛选排序(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

【深度学习】智能手写数字识别系统

文章目录 一&#xff0e;实验课题背景说明1.1实验目的1.2实验环境1.2.1安装PyTorch1.2.2安装其他必要的库 二&#xff0e;模型说明2.1模型概述2.2模型结构 三&#xff0e;数据说明3.1 输入数据3.1.1输入数据特征3.1.2输入数据维度3.1.3输入数据预处理 3.2 数据格式3.2.1输出数据…

qt 实现模拟实际物体带速度的移动(水平、垂直、斜角度)——————附带完整代码

文章目录 0 效果1 原理1.1 图片旋转1.2 物体按照现实中的实际距离带真实速度移动 2 完整实现2.1 将车辆按钮封装为一个类&#xff1a;2.2 调用方法 3 完整代码参考 0 效果 实现后的效果如下 可以显示属性&#xff08;继承自QToolButton&#xff09;: 鼠标悬浮显示文字 按钮…

Bagging与Boosting的应用与优势

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

Excel 常用技巧(四)

Microsoft Excel 是微软为 Windows、macOS、Android 和 iOS 开发的电子表格软件&#xff0c;可以用来制作电子表格、完成许多复杂的数据运算&#xff0c;进行数据的分析和预测&#xff0c;并且具有强大的制作图表的功能。由于 Excel 具有十分友好的人机界面和强大的计算功能&am…

【Python高级编程】Pickle实现AI算法训练的权重数据的保存

任务描述 代码实现 import pickle import time import os import numpy as np# 模拟耗时的权重计算过程 def calculate_weights():print("开始计算权重...")time.sleep(5) # 模拟耗时操作&#xff0c;暂停5秒以模拟计算过程weights np.random.rand(10, 10) # 随机…

python实践笔记(三): 异常处理和文件操作

1. 写在前面 最近在重构之前的后端代码&#xff0c;借着这个机会又重新补充了关于python的一些知识&#xff0c; 学习到了一些高效编写代码的方法和心得&#xff0c;比如构建大项目来讲&#xff0c;要明确捕捉异常机制的重要性&#xff0c; 学会使用try...except..finally&…

小区噪音监测管理系统设计

一、引言 随着城市化进程的加快&#xff0c;小区居民对于居住环境的要求日益提高。其中&#xff0c;噪音污染已成为影响居民生活质量的重要因素。因此&#xff0c;设计一套小区噪音监测管理系统&#xff0c;对于提升居民的生活品质和小区管理效率具有重要意义。本文将详细阐述…

如何拥有自己的微信小程序

如何拥有自己的微信小程序 ~~话先放在这里~~ 写在前面申请一个属于自己的小程序先去[微信开放平台](https://open.weixin.qq.com/home)申请一个你的小程序扫码申请新小程序小程序该记好的个人信息 安装微信开发者工具下载工具关联你的小程序请求域名配置发布小程序 BUY一个自己…

SQL:按用户名复制权限

生产系统中有一个模块是管理用户及菜单权限&#xff0c;它们是由3个数据表组成&#xff0c;关系及字段如下&#xff1a; 原来为每个用户添加菜单的访问权限时都是一个一个添加&#xff0c;但今天遇到有个新来的员工&#xff0c;需要具有与另一个员工相同的权限。新建一个用户后…

PS插件创成式填充功能全面测评:轻松实现AI修图新高度

大家好&#xff0c;我是你们的AIGC测评博主。今天&#xff0c;我将为大家带来一款ps插件创成式填充功能——深度体验 在图像处理领域&#xff0c;AI技术的应用已经越来越广泛。而创成式填充功能&#xff0c;无疑是其中的佼佼者。它利用AI技术&#xff0c;能够根据用户输入的关…