2.6. 缓存

如果某个实现对每个写操作支持范围、实现和可用状态的检查,通常会触发一系列对相机的读操作。大多数用于有效性检查的数值很少或不会发生变化,所以可以放入缓存。相机描述文件包含所有必需的定义以确保缓存的一致性。

图8 Area of Interest

为说明这一点,需要用到更复杂的例子。图8显示了相机图像上的AOI。相机只需要发送AOI内的图像,图中的AOI是由Top、Left、Width和Height四个参数给出的矩形。

图9 Controlling the Area of Interest

如图9所示,这四个参数都从寄存器中取出。当然,这种简单的方式不能很好地处理,因为这四个参数的取值范围都不是无限的。假定像素坐标从0开始,有下面的限制:

0 ≤ Left ≤ ImagerWidth −Width

0 ≤ Top ≤ ImagerHeight − Height

1 ≤ Width ≤ ImagerWidth − Left

1 ≤ Height ≤ ImagerHeight − Top

为了处理这些限制,每个参数的最大值都必须用SwissKnife节点计算;最小值是固定的。结果GenApi节点图如图10所示。注意,这里加入了第二层的Integer节点并且最大值由IntSwissKnife节点处理。

图10 Controlling the Area of Interest while taking restrictions into account

假定图像处理器有VGA模式(640 x 480),TopMax节点的XML代码看起来可能是这个样子的:

<IntSwissKnife Name="TopMax">

<pVariable Name="CURHEIGHT">HeightReg</pVariable>

<Formula>480-CURHEIGHT</Formula>

</IntSwissKnife>

让我们再回到缓存的话题,你应该不会希望每次设置Left属性的时候都去读一次HeightReg或者判断一次TopMax节点。这的确是不必要的,当(且仅当)你确定HeightReg只在GenApi自身写了一个新的值到这个寄存器的情况下才发生改变。这种情况下,你可以把HeightReg和TopMax的值放入缓存。

如果用户写了一个新的值到HeightReg,HeightReg缓存的值可以立即发生变化,并且需要令TopMax缓存无效。当下一次有人要访问Left节点的时候,会去读TopMax,因此为TopMax创建一个新的缓存入口。

规则:当一个节点的内容发生变化的时候,要通知其所有的客户端,以便客户端可以令缓存无效。

通常,相机描述文件中结点间的连接包含了所有需要的信息,以便实现程序能处理缓存而不需要用户操心。不过,在有些情况下,相对于节点直接描述的,相机本身包含更多的依存关系。

某些相机包含一个叫做Binning的属性,当Binning被置为ON,相邻像素的值(charge)被合并,实现较好的效果,但代价是分辨率较低。假设一个VGA分辨率的图像卡,典型的配置如下:

l       无Binning (640 x 480)

l       水平Binning (320 x 480)

l       垂直Binning (640 x 240)

l       全Binning (320 x 240)

在GenICam中,这个属性要用一个含有四个值的枚举型来描述(见图11)。改变binning就意味着改变图像卡尺寸——不是实际的物理图像卡,而是用来表示AOI参数的限制的逻辑图像卡尺寸。

图11 Controlling the Area of Interest taking binning into account

我们假定相机通过寄存器提供有关当前(逻辑)图像卡尺寸的信息。如图11所示,我们引入了两个新的节点:ImagerHeightReg和ImagerWidthReg。TopMax的XML代码看起来像这个样子:

<IntSwissKnife Name="TopMax">

<pVariable Name="CURHEIGHT">HeightReg</pVariable>

<pVariable Name="IMAGERHEIGHT">ImagerHeightReg</pVariable>

<Formula>IMAGERHEIGHT-CURHEIGHT</Formula>

</IntSwissKnife>

正如我们所见,如果用户改变Binning属性,ImagerHeightReg的值将会改变。然而这两个节点间没有数据流。为确保在BinningReg节点的内容变化的时候,ImagerHeightReg节点的缓存无效,必须在两个节点间引入一个<pInvalidator>连接。这个连接的唯一用途是,说明这两个属性间隐藏的依存关系,以及确保缓存总是一致的。

2.7. 识别并判断相机描述文件的版本

必须能够通过一种统一的方式,来识别一个相机描述文件,及其所描述的相机。另外,随着时间的推移,相机描述文件也要相应地扩展,例如,当相应的相机产品增加了属性的时候。这就产生了对版本机制的需求。GenApi语法本身也要与时俱进,例如,当加入了新的节点类型的时候,所以也要求对规范提供版本机制。

在<RegisterDescription>元素的属性列表中可以发现必要的方法,这个元素是XML文件最外层的框。下面来看一个例子:

<RegisterDescription

ModelName="Example01"

VendorName="Test"

ToolTip="Example 01 from the GenApi standard"

StandardNameSpace="None"

SchemaMajorVersion="1"

SchemaMinorVersion="0"

SchemaSubMinorVersion="1"

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_0"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.genicam.org/GenApi/Version_1_0

../GenApiSchema_Version_1_0.xsd">

所描述的相机由VendorName: / ModelName 对来标识。因为有商标保护,我们可以假定VendorName是唯一的。ToolTip属性用来提供设备的附加信息,并且可以显示给用户,例如,用总线上设备的选择列表的方式。

相机描述文件内的名称可能来自不同的命名空间,关于这一点在第2.8.1章有更详细的说明。在一个给定的相机描述文件中,名称要么来自自定义的命名空间,要么来自标准命名空间。属性StandardNameSpace表示文件中所使用的标准命名空间。

一个相机描述文件中不同项目的版本信息遵循共通的规则,并使用一个由三部分组成的版本号(version number):

<Major>.<Minor>.<SubMinor>

例如,“1.4.2”

兼容性规则(compatibility rules)如下:

l       Major版本号高的文件不向下兼容

l       Minor版本号高的文件向下兼容

l       改变SubMinor仅仅表示修复了问题;总是应该使用SubMinor最高的文件

例:版本1.3.0兼容版本1.1.*,1.2.*和1.3.*(星号表示不关心)。它不兼容版本2.*.*。如果版本1.3.2可用,则应该用它来代替1.3.0。

2.7.1. 格式的版本

属性SchemaMajorVersion、SchemaMinorVersion和SchemaSubMinorVersion描述XML文件用的GenApi格式的版本。这些属性是强制的,目的是提供信息。另外,格式的Major和Minor版本号也反映在命名空间(参见xmlns入口)和格式的文件名(参见xsi:schemaLocation入口)。

在这个例子中,命名空间是“http://www.genicam.org/GenApi/Version_1_0”。需要用到这个格式文件的程序既可以根据URL通过互联网来得到它,也可以通过由schemaLocation的第二部分给出的路径来找到这个文件,这个路径是可选的,在这个例子中是“../../GenApi/GenApiSchema_Version_1_0.xsd”,并假定XML文件存放在GenICam参考实现的目录结构中。

xmlns:xsi入口的“http://www.w3.org/2001/XMLSchema-instance”描述了格式语言自身的命名空间。

注意,如果一个实现支持,例如版本1.3.*的格式,则必须提供3个格式文件:版本1.0.*、1.2.*和1.3.*,这是向下兼容的要求,因为旧的XML文件带有旧的命名空间,需要旧的格式文件;另一方面,这个实现不支持使用新版本格式文件的XML文件,例如1.4.*要被拒绝。因此,有必要把版本号反映到格式的命名空间。

2.7.2. 相机描述文件的版本

属性MajorVersion、MinorVersion和SubMinorVersion描述XML文件自身的版本。相机的制造商有责任遵守兼容性规则。

相机描述文件的向下兼容是什么意思呢。假设一个相机,其版本1.0仅仅实现了一个属性。现在假定这个相机为另一个属性扩展了firmware。有两个方法可以在相机描述文件中处理这个情况。如果仅仅把这个属性添加到XML文件,就是暗示这个属性已经存在了。因为对旧版的相机来说情况并非如此,所以新的文件不是向下兼容的,结果其版本号必须是2.0。

另一个更智能的解决办法是,在相机中(!)引入一个查询寄存器,用户可以检查这个寄存器以判断这个新的属性是否已经实现。现在可以加入这个新的属性,并允许用户通过属性的访问模式来判断属性是否实现。这样这个新的文件就是向下兼容的,其版本可以是1.1。当然,只有在一开始相机就提供这个查询机制的情况下,这个方法才是可行的。采用第二种方法的优点是,对于这个相机的整个家族,只需要维护一个相机描述文件。

注意,这里的兼容性(compatibility)指的仅仅是属性节点(feature nodes)及其功能,而不是实现节点(implementation nodes,参见2.8.2章以获得详细信息)。

2.7.3. 识别并缓存相机描述文件

加载一个相机描述文件可能包含一个或多个预处理步骤。为加快处理速度,预处理过的XML文件可以被放入缓存。在缓存中,需要一个key来唯一标识相机描述文件。把元素<RegisterDescription>的属性VendorName、ModelName、MajorVersion、MinorVersion和SubMinorVersion合并起来是足够了,但是用起来有点不方便。

为简化缓存,引入了VersionGuid属性,属性VersionGuid含有一个GUID,每当属性VendorName、ModelName、MajorVersion、MinorVersion或SubMinorVersion中任何一个发生变化的时候,都必须要改变这个GUID。VersionGuid唯一地标识一个相机描述文件的某个版本,和文件名。

不必把所有不同的相机描述文件都放入缓存,可以只放最新的文件,最新的文件通过向下兼容的方式包含了所有其它的。对于每个VendorName、ModelName和MajorVersion号,都有一个这样的文件。这种文件的缓存key是ProductGuid,ProductGuid也有一个GUID,每当VendorName、ModelName或MajorVersion发生改变的时候必须改变。

GenIcam标准(三)的更多相关文章

  1. GenIcam标准(四)

    2.8.可用的节点类型 本章对每个可用的节点类型提供一个概要的描述,包括其功能.用途以及最关心的参数.另外,对于每个节点在GenICam标准的XML格式文件中的layout,会有一个正式的说明.这个格 ...

  2. GenIcam标准(二)

    2     GenApi模块 – 配置相机 2.1. 简介 GenApi模块解决如何去配置相机的问题.主要的思路是,让相机生产厂商为他们的相机提供机器可以识别的产品说明.这些相机描述文件(camera ...

  3. GenIcam标准(一)

    1.概述 如今的数码摄相机包含了很多的功能,而不仅仅是采集图像.对于机器视觉相机来说,处理图像并把结果附加到图像数据流上,控制附加的硬件,代替应用程序作实时的处理等都是很平常的事情.这也导致了相机的编 ...

  4. GenIcam标准介绍

    GenICam TM的目标是为各种相机和设备提供通用编程接口.无论他们使用什么接口技术(GigE Vision,USB3 Vision,CoaXPress,Camera Link HS,Camera ...

  5. GenIcam标准(五)

    2.8.10.Enumeration, EnumEntry Enumeration节点把一个名称(name)映射到一个索引值(index value),并实现Ienumeration接口.Enumer ...

  6. C# 编码标准(三)

    一.代码注释 1.文档型注释 该类注释采用.Net已定义好的Xml标签来标记,在声明接口.类.方法.属性.字段都应该使用该类注释,以便代码完成后直接生成代码文档,让别人更好的了解代码的实现和接口.[示 ...

  7. GenIcam标准(六)

    2.9.可用的接口 本章用伪代码列出在2.3章介绍过的最重要的接口.对每个接口,实际的实现可以提供更多的方法,例如,除了SetValue(value)方法,还可以用直接映射到SetValue()的方式 ...

  8. GenIcam标准关键词整理

    1.<?xml> 版本信息和编码方式 IntSwissKnife 需计算和判断的节点 MaskedIntReg 需查询的节点 2.<RegisterDescription> 寄 ...

  9. 机器视觉必知-GenICam相机通用接口标准

    机器视觉必知-GenICam相机通用接口标准 GenICam(相机通用接口): 一种通用软件接口 通用相机接口标准 目前机器视觉行业所使用的相机几乎均以相同方式来进行配置,即:---通过在注册表中的读 ...

随机推荐

  1. 让前端攻城师独立于后端进行开发: Mock.js

    一.Mock.js是什么? 目前的大部分公司的项目都是采用的前后端分离, 后端接口的开发和前端人员是同时进行的. 那么这个时候就会存在一个问题, 在页面需要使用大量数据进行渲染生成前, 后端开发人员的 ...

  2. vue自定义组件并使用

    以下是使用自己写的一个简单的文件上传框为例 1.自定义组件结构(一个js文件,一个vue文件),最好单独放一个文件 2.upload.vue 内容 其中,action是父组件传递给子组件的参数,使用p ...

  3. MVC、RPC、SOA、微服务架构之间的区别

    MVC.RPC.SOA.微服务架构之间的区别 一.MVC架构 其实MVC架构就是一个单体架构. 代表技术:Struts2.springMVC.Spring.Mybatis 等等. 二.RPC架构 RP ...

  4. 20130912.Windows下常用命令的使用(不断更新)

    Win+R================================ cmd => 命令行 lpksetup => 弹出安装或者卸载Windows显示语言 ipconfig => ...

  5. 【codeforces 235B】Let's Play Osu!

    [题目链接]:http://codeforces.com/problemset/problem/235/B [题意] 让你玩一个游戏,游戏结果由一个长度为n的01字符组成; 这个结果的分数与连续的1的 ...

  6. UVALIVE 4256 Salesmen

    Salesmen Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Original ...

  7. Image Processing for Very Large Images

    The key idea here is the partial image descriptor VIPS(VASARI Image Processing System) 是近几年逐渐兴起的针对大图 ...

  8. Hbase读取数据

    get命令和HTable类的get()方法用于从HBase表中读取数据.使用 get 命令,可以同时获取一行数据.它的语法如下: get ’<table name>’,’row1’ 下面的 ...

  9. 洛谷——P1351 联合权值

    https://www.luogu.org/problem/show?pid=1351 题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i , ...

  10. Maven简单介绍(Maven是什么)

    简单介绍 Maven,在意第绪语中意为对知识的积累.Maven最初用来在Jakarta Turbine项目中简化该项目的构建过程. Jakarta Trubine项目有多个project.每一个pro ...