文章目录
- 使用HALCON开发应用程序
- 1. 认识HALCON:架构&数据结构
- 1.1. HALCON算子
- 1.2. 参数与数据结构
- 1.2.1. Images 图像
- 1.2.2. Regions 区域
- 1.2.3. XLDS 扩展线
- 1.2.4. Handles 句柄
- 1.2.5. Tuple Mode 元组模式
- 1.3. HALCON与并行编程
- 1.4. HALCON支持计算设备
- 1.5. HALCON XL
- 1.6. 图像采集
- 1.7. I/O设备
- 2. 快速开始HDevelop
- 3. 在编程语言中使用HALCON
- 3.1. C# 和 VB .NET
- 4. 扩展HALCON
- 4.1. 扩展包(用户自定义算子)
- 4.2. 图像采集接口
- 4.3. I/O设备接口
- 5. 限制
- 5.1. 一般限制
- 5.2. 计算设备相关的限制
- 5.3. 图像采集相关限制
- 5.4. OpenGL相关限制
- 5.5. 扩展包相关限制
使用HALCON开发应用程序
本文主要是Quick Guide第二章节的内容。
HALCON提供了多种开发程序的方式。不过为了充分利用整套体系,一般推荐下图的方式。
- 图像检测、视觉方法的原型制作以及视觉方法的最终开发在HDevelop中进行。这一步,编程(program)会被结构化在程序(procedure)中,每个程序代表一个子任务,如初始化、处理、清理。主程序仅用作调用过程的测试环境来传递图像和接收结果。(这步的程序是在HDevelop中写的,暂且称它为HDevelop程序,简称程序(procedure))
- 完整的应用程序是在VS那样的集成环境中开发的。有两种方式可以集成HDevelop程序(这步的程序是在VS这样的IDE中写的,一般称应用程序(application)):
- 将程序导出为你要使用的编程语言,并引用它,如 include 语句。
- 或者你可以使用HDevEngine直接执行HDevelop程序。UI和其他代码使用所给定语言提供实现。最后,编译并链接工程。
- 生成的应用程序(附带HALCON库),代表被加载到目标机器上或发给客户的最终解决方案。
这种三步开发的方式有几点优势:
- 视觉部分可以很容易被优化或扩展,因为HDevelop提供了比标准编程环境更完备的对图像数据的检测和调试功能。
- 若您使用HDevEngine,在HDevelop程序发生更改后(如果没有改变程序的签名),您甚至不需要编译和链接应用程序。若您正在使用导出的代码,通常不需要修改应用程序其余部分,而只需要再次编译和链接应用程序。
- 由于视觉部分与一般代码是分离的,所以可以很容易地独立执行。而且,它可以单独提供给其他人,而不需要每次提供整个工程。若遇到支持性问题,可以将带有图像的HDevelop程序快速发给分销商。
- 最后,可以轻松在其他架构的电脑上重用,如Linux,因为HDevelop在主流操作系统上以相同方式运行。
注意,在这两种情况下(HDevEngine&导出代码),应用程序仅包含HALCON功能 - HDevelop的开发工具(如助手或其他GUI元素),无法从编程语言访问。
1. 认识HALCON:架构&数据结构
HALCON的架构(architecture)、数据结构(data structure)和内部机制(internal mechanism)的开发是依据以下理念的:
- 高效(efficient)
- 开放(open)
- 标准化(standardized)
- 自描述(self-describing,自描述简单讲就是通过内部规范、概念就描述得很清楚,不需要用户去了解许多外部概念)
高效意味着每个HALCON算子的执行时间尽可能短。此外,算子的设计必须使标准序列或复杂任务的组合仍然高效。
开放的架构在两方面上很重要:
- 首先,能用不同编程语言来使用HALCON。支持外部数据传给HALCON和访问HALCON内部数据。
- 有公开透明的接口(transparent interface)用于集成用户定义的算子和非标的图像采集设备。这种开放式架构允许,在不改变HALCON安装的情况下,将图像采集接口简单更新至新版本。
标准化意味着签名、命名、算子的使用和数据结构都严格遵循一定规则。这能使得学习变得更快速,歧义少。
最后,HALCON在文档中提供了每个算子以及它们的参数的详细信息(这也是为什么称作自描述的原因)。
HALCON的基础架构如下:
其主要部分是图像处理库(Image Processing Library),它由巨量的 operator(算子) 组成。您可以以扩展包的形式开发自己的算子包。你可以通过像HALCON/C++这样的编程语言接口的形式,在应用程序中使用算子。这些库允许在不同编程语言中直接使用算子。HDevelop也用了语言接口,但对用户来讲是透明的(即用户是看不到的)。
HALCON提供了名为 Image Acquisition Interface(图像采集接口) 的通用接口来访问图像采集设备。它以一种通用的方式来使用各种采集设备。该库包含特定设备的实现,在需要时会动态加载。
类似地,访问I/O设备也有专门的I/O设备接口。这些接口允许以同一种方式访问不同的I/O设备。这些库也是在需要时动态被加载。
HALCON中,图像处理库(包含大量算子)是核心。上层用户可以通过各种编程语言去调用这些算子。底层,HALCON有通用接口去访问图像采集设备和I/O设备。
1.1. HALCON算子
HALCON库中的任何功能,都是通过算子来完成的。当前版本(笔者用的18.1)有超过2000个算子。大部分算子内部包含多个函数,可以通过参数去选择调用它们。所有算子的完整列表可以在HDevelop的算子对话框或参考手册中找到。算子重要特征如下:
- 算子间是没有层次关系的。从软件架构的角度看,所有算子都是处在同一层级。(这点大概是说,只从调用来讲,不看结果的话,算子间不存在依赖关系,可以将任意算子组合拼接,这点符合软件设计的低耦合思想)
- 当然,算子也是有逻辑分组的。可以从C++和.NET提供的类中直接看到,其中处理相同数据类型的算子在对应类中作为成员而存在。
- 算子有一套输入输出参数的排列标准。
- 算子的设计遵循开放架构的规则。因此,你可以创建自己的算子,从而扩展HALCON,同时为自己的算子提供 look-and-feel(外观和感觉,大概是指输入输出吧,外观就是从外部看到的,感觉就是一种反馈)。
- 许多算子可以自动并行执行(对用户透明),这使得在多处理器或多核计算机上处理大图像时,能轻松地加快程序速度。
小结:
- 算子间独立、并列,不存在复杂的依赖关系。
- 算子逻辑上也是有分组的,可以在类中查看到。
- 可以扩展HALCON的算子。
- 许多算子可以自动并行执行,大大提升执行效率。
1.2. 参数与数据结构
基本概念:
- HALCON有两种基本参数类型:iconic data(图像数据,包括images图像、regions区域和XLD contours轮廓)和control data(控制数据,包括integers整型、strings字符串、handles句柄等)。
- 每个算子的参数都以标准顺序排列:输入的iconic、输出的iconic、输入control、输出control。有些算子,可能不需要所有参数,但是顺序保持不变。
- 每个算子都有一个自描述的接口。除了标准文档外,描述还包括参数信息,如类型和值列表,您可以在参考手册或HDevelop的对话框中在线访问。
- 算子的输入参数始终不会变,所以它的语义非常简单清晰。不过,为了保证最大性能,有三个算子不遵循此原则(set_grayval、overprint_gray和overprint_region)。
- 开放架构允许您访问内部数据和集成外部数据。
- 所有2D图像处理所需的数据结构,如(多通道)images图像、regions区域、contours轮廓、tuples元组(一种数组)等,都直接支持使用高效的实现。
1.2.1. Images 图像
基本概念:
- 图像属于iconic data(图像数据)。
- 图像的主要部分是channels通道,即包含各种像素类型灰度值的矩阵(下文会提到)。
- 对于每个图像,domain(域)指定了其需要处理的部分。从而就衍生出了 region of interest(ROI,感兴趣区域) 。domain是一个HALCON region,且能被灵活定义(可以是一个简单的矩形,也可以是一组不相连的像素)。更多细节在后面ROI处理的章节中会介绍。
Pixel Data(像素数据)
几乎任何值都可以是像素数据,从标准的8位灰度值到描述导数的浮点数。
对于整数,1、2、4字节(有无符号)都可用。除此之外,浮点数和复杂的图像数据也可用。它还支持用于描述边缘方向或色调值的特殊数据类型。
Image Channels(图像通道)
一个通道对应一个图像矩阵。每个图像最多能有65535个通道。一个图像所有通道的尺寸相同。
通常:单通道的灰度值图像、彩色图像带有三通道(如RGB)或来自多光谱传感器的多通道图像作为纹理滤波的结果。
图像通道,这个我觉得可以结合图像的来源进行理解。
简单讲一下相机输出图像的过程,
首先物体的光进入镜头成像后,像是打在感光芯片上的。芯片上有许多微小颗粒的传感器,每个(或每几个)传感器都会将光线变化转换为电信号变化,输出到外部系统。所以图像的每个像素点,实际上是对应相机的感光传感器的,两者间就像有通道连接一样,传感器对外界光线的变化导致像素变化,组合到图像上就是图像的变化。
黑白图像,可能只需要对应一个灰度通道。彩色的对应多个通道,然后根据色彩比例显示结果。
Coordinate System(坐标系)
图像的原点位于左上角像素的中心。使用行和列坐标访问独立的像素(就跟矩阵一样)。坐标的范围是从(0, 0)到(height - 1, width - 1)。
注意,由于原点是在左上像素的中心,所以像素的角具有非整数坐标。例如,左上角像素具有Corner Coordinate角坐标 (-0.5, -0,5), (-0.5, +0.5), (0.5,-0.5)和 (0.5, 0.5)。(如下图,假设该正方形就是图像左上)
1.2.2. Regions 区域
基本概念:
-
区域属于图像数据。
-
区域被定义为一个像素集。区域的像素不需要彼此相连。这表示任意像素集都能当作单个区域来处理。使用算子 connection ,可以将一个区域划分为 connected components,即由连接的像素组成的组件。
-
区域的底层实现是基于runlength encoding(游程编码)的,它很高效。这种编码优点是:low memory consumption(低内存消耗)、efficient processing(性能卓越)和easy handling of ROI(易于处理ROI)。
游程编码其实是一种简单的无损压缩编码方式。
比如 aaabbbccc这个字符串,用游程编码表示就是3a3b3c。很明显在有大量连续相同的数据出现时,使用该编码方式压缩率很高。这边具体是怎么应用的,不讨论。 -
由于是基于游程编码实现的,随着连接组件的扩展,可能会出现重叠区域。这在基于标签图像的经典实现中是不会出现的。
-
区域内像素的坐标不限于给定图像的坐标,该区域可以大于图像,这可能是扩张操作导致的。可以使用参数值为 clip_region 的算子 set_system 来控制是否将区域截取到图像最大范围。
请注意,默认情况下,区域将裁剪为当前图像大小。只要没有创建或加载图像,他们就会被裁剪为默认图像大小(HDevelop:512✖512; 编程语言:128✖128)。为了防止不想要裁剪,建议在创建或加载区域之前创建或加载一个图像。 -
应用程序的区域数量可以任意多个。
1.2.3. XLDS 扩展线
基本概念:
- XLD是eXtended Line Description(扩展线描述)的缩写,包含所有基于轮廓和多边形的数据。
- XLD属于图像数据。
- 像 edges_sub_pix 这样的 Subpixel-accurate 算子会将轮廓作为XLD数据返回。
- 轮廓是由线连接的2D 控制点(control points)序列。
- 通常,控制点之间的距离约为一个像素。
- 除了控制点之外,XLD对象还包含本地和全局属性。典例是,控制点的边缘幅度或轮廓段的回归函数。
- 除了XLD对象的提取,HALCON还支持进一步的处理。例如,根据给定的特征范围选择轮廓,或将轮廓分割成直线、圆弧、多边形或平行线。
1.2.4. Handles 句柄
基本概念:
- Handles(句柄)属于控制数据。
- 句柄是对复杂数据结构的引用,例如一个到图像采集设备的连接或形状的匹配模型。出于效率和数据安全的原因,在算子之间传递的不是整个结构,而是句柄。
- 句柄由不同的控制数据类型表示。它们不会发生变更,在不同的执行和版本下会有所不同。
- 一旦覆盖所有元组中的所有引用,句柄将自动清除。
- 使用句柄的示例由图形窗口、文件、套接字、OCV、OCR、测量、匹配等。
如果学过编程的话,对句柄应该不陌生。引用一些复杂、抽象的结构时,往往是通过句柄。比如WinForm编程中的窗口句柄,一些底层资源的获取控制也是通过句柄。
1.2.5. Tuple Mode 元组模式
元组这个概念可以先浅浅地理解一下,
元组(tuple),多个数据项捆绑在一起而形成的一个新的元素,用来表达一个复杂概念。
常见到的形式是这样的,(“小明”, “8岁”, “135m”, “30kg”)。
基本概念:
- 图像和控制数据能够包含单个对象/值或多个对象/值(称为元组)。例如,控制变量可以包含一个或任意数量的基本数据类型(整数、浮点值、字符串、句柄),也可以不包含基本数据类型,并且每个元素的类型可以不同。
- 大多数算子接受单个值(simple mode,简单模式),也接受多值(tuple mode,元组模式)。
- 例如,若单个区域调用了类似 area_center 的算子,则会为该区域和该区域的中心坐标返回一个值。当多个区域调用算子时,则会返回相应数量值的元组。因此,若四个区域调用 area_center ,它会返回3个元组(1个用于区域,2个用于中心坐标),每个元组包含与4个区域对应的4个值。
- 控制元组的索引范围从0到值的数量-1,n个就是(0,n-1)。(这点和数组下标差不多)。与之相反,图像元组的索引是从1开始的。
1.3. HALCON与并行编程
HALCON支持并行编程(例如,多线程编程。并且是线程安全和可重入的)。这意味着多个线程可以同时调用HALCON算子。除了支持并行编程外,若在多处理器或多核硬件(如dual-Pentium板)上运行,HALCON还会自动并行化算子。例如,对于四处理器的板子,图像会被分成四部分,然后由执行相同算子的四个线程并行处理。结合HALCON处理图像和区域的理念,这种形式的并行化非常高效,因为不需要复制图像。并行化程序会在线优化,以减小并行化开销。例如,非常小的图像不会被并行处理,因为并行的开销会超过并行化加速的提升。此外,并非所有的HALCON算子都适合并行化。
要注意的是,HALCON是为共享内存的系统设计的,即多个处理器共享一个公共内存的系统,这是典型的多处理器或多核板的情况。主要原因是,只有在共享内存系统中,线程才能共享HALCON对象数据库,且不需要拷贝图像。这种限制意味着HALCON的并行化技术不适合在工作站集群或其他不提供共享内存的多处理器或多核硬件上使用。
1.4. HALCON支持计算设备
HALCON支持GPU处理,使用GPU能显著加速你的程序。在HALCON上,只需要选择开/关就能在GPU上执行代码,非常简单易用,它的实现依赖于OpenCL,因此独立于生产商,甚至不限制显卡。
它支持所有的新NVIDIA和ATI卡。兼容显卡的列表可以在下面网址查阅:
- NVIDIA:https://www.nvidia.com/object/cuda_learn_products.html
- ATI/AMD:http://developer.amd.com/gpu/atistreamsdk/pages/default.apsx#five
始终安装最新的驱动。对于AMD来说,Stream SDK仍然需要被安装。
许多HALCON算子支持计算设备。在参考手册中可以查阅到算子是否支持计算设备。若算子支持计算设备,如 edges_sub_pix ,在’并行化(parallelization)'部分中会提到。
正如前面所说的,GPU处理非常简单易用。GPU使用算子 init_compute_device 进行初始化。GPU处理使用 activate_compute_device 打开,使用 deactivate_compute_device 关闭。
要注意,在GPU上计算,数据将会从CPU转移到GPU上。转移数据会消耗一些处理时间。因此,为了充分加快GPU处理流程,推荐:
- 使用高端显卡
- 使用带有高内存带宽的硬件
- 将你的程序设计好,分组尽可能多的GPU支持的操作,以减少内存转移。
但是,使用计算设备并不总是能提高运行性能。有些情况,一般的CPU处理也许更快:
- 你的CPU已经非常好了,尤其是在多核系统下
- 使用的是快速算子
当在GPU上计算时,默认只有一张显卡会被使用。当然,你也可以使用多张显卡(计算设备)。多计算设备下,每个设备会使用一个线程。
1.5. HALCON XL
HALCON对常规尺寸的图像做了优化,即尺寸不大于32768✖32768。但是,特别是线扫描相机应用,通常会提供大图,它的高度往往超过32768。对于这些应用,你可以使用HALCON XL,它不会对图像尺寸做出限制。
但它仍然会有一些其它限制:
- 若图像尺寸超过0.5GB,你无法在32位平台处理它,必须使用64位操作系统。
- 与使用的操作系统无关,系统可用的内存也许会受到限制。
1.6. 图像采集
目前,HALCON以动态链接库(Windows上是DLL,类Unix上是共享库)的形式为超过50种图像采集卡(frame grabber)和数百种工业相机(analog、Camera Link、USB 2.0、IEEE 1394和GigE)提供了接口。这些库和HALCON库一起被安装,它们的名字以hAcq为前缀;HALCON XL使用的库以xl为后缀结尾。
HALCON图像采集接口库是图像采集设备制造商提供的软件与HALCON之间的桥梁。它们生成一个通用的接口,只需要(调用)一些算子即可。
若你成功安装了图像采集设备,从HALCON中访问它你需要做的就是调用 open_framegrabber 算子,指定图像采集接口的名称和一些额外参数,如:要连接的相机等。然后,通过调用 grab_image(或grab_image_async) 算子来获取图像。
注意,HALCON图像采集接口可能比HALCON库本身变更更频繁。原因之一是MVTec会不断开发新接口;此外,若图像采集设备制造商提供的软件发生变化,例如,如果集成了新功能,则会添加相应的HALCON接口去适配它。你可以在这里查找最新的信息和可下载的接口及文档。
1.7. I/O设备
HALCON为多种I/O设备(有时也称I/O模块)提供接口以启用数据采集。这些接口也是通过动态链接库中使用的。库的名称以hio为前缀;同样,HALCON XL用的库以xl为后缀。
HALCON I/O设备接口使用一小组算子提供对不同I/O设备统一的访问方式。在你安装完I/O设备后,使用算子 open_io_device 建立一个连接,指定I/O设备接口的名称并选择一些设备指定参数。一旦建立连接,就可用通过调用 open_io_channel 打开一个传输通道(transmission channel)。要在该通道上读写值,分别使用 read_io_channel 和 write_io_channel 。
注意,HALCON I/O设备接口也可能变动比HALCON库本身更频繁。
2. 快速开始HDevelop
HDevelop是一款用于原型和应用程序开发的强大IDE,简单易用。
在Windows下就和一般软件一样,安装完双击HDevelop图标即可启动。
要加载一个示例,选中 文件> 打开程序 ,会出现一个文件选择框,该框内会展示HDevelop示例(Windows下)的主要目录。对于初学者,推荐从中选一个示例进行学习。你也可以使用菜单中的 文件> 浏览HDevelop示例程序 ,选中某个类别的例程后打开(这种方式相比之前的选择目录更直观)。
在加载例程后,相应的程序代码会在程序窗口展现。使用的变量在变量监测窗口中可用看到(还未被实例化)。程序现在准备好执行了。
运行程序的步骤:
-
在工具栏中,点击 运行 按钮来执行程序。在停止状态下若要继续执行,再次单击 运行 。
-
除了 运行 按钮,HDevelop还提供了一个用于逐句执行程序(step through program)的按钮——执行单行并随后立即显示结果。 若该过程包含一定步骤, 则 单步跳入(step into) 和 单步跳出(step out) 会很有用。
-
若要再次执行已运行完的程序,点击 重置程序执行(set program to initial state) 然后 运行 。
要将某个部分再次执行,用鼠标点击想要执行代码行的左侧,使得程序计数器(绿色箭头)重新定位,然后点击 运行 。
理解程序的提示:
-
在主窗口的底部,HDevelop提供了一个状态栏,它会显示一些有用的提示信息。尤其是在执行期间,当程序停止以可视化结果或等待用户交互时,它会给出相应的指示/提示。
-
对于个别程序行的信息,双击它们使得应用的算子名称及其参数显示在 算子/过程 窗口中。帮助按钮会提供具体信息。
-
许多程序会自动将相关数据显示在图像窗口中。手动可视化可以通过双击变量监测窗口中的图标轻松实现。
-
一些示例包含过程。包含过程的程序行会被颜色标记,颜色由菜单栏的 编辑(Edit)> 参数选择(Preferences)> 用户接口(User Interfaces)> 程序窗口(Program Window) 指定。
你可以通过程序窗口中的"程序"组合框在程序间进行切换。 -
在许多示例中,会出现赋值、算术运算(两者在程序中通常用":="表示)或循环之类的控制结构。
更多HDevelop提示:
- 取决于选择安装的类型,在示例程序中并非所有图像都是可用的。该情况下,推荐安装需要的图像。
- 有些程序使用图像采集设备来采集图像或I/O设备接口来获取数据。若相应设备不可用,将会引发错误。 这种情况下,推荐使用其它示例或修改参数以适配可用硬件。
3. 在编程语言中使用HALCON
正如架构图中所呈现,HALCON提供了编程语言接口。语言接口是库,使你能够以一种简单的方式调用算子和使用HALCON库的数据类型。它为两种语言设计了专门的语言接口,它们是C和C++。相反,.NET接口可以被不同的语言使用,如VB、C#。
与你选择的编程语言无关,一个适配的接口库(halconc.,halconcpp.,halconx.*)与HALCON库必须被链接到应用程序。除此之外,C和C++对应的头文件也必须被引入;若是.NET程序,对应的程序集 halcondotbet.dll 必须被引用。
要开始开发,推荐首先检查准备运行(ready-to-run)示例程序之一。该示例中,你可以看到工程如何被安装以及如何使用算子和数据类型。
每种编程语言接口中的类和类型的命名,算子的命名规范等,可能会不同于该编程语言传统的命名规则。
编程语言调用有多种(C++、C、C#),我这边就介绍下C#的,因为该项目开发主要用C#。
3.1. C# 和 VB .NET
C#和VB .NET都是通过.NET接口使用HALCON。
和C++相似,.NET调用提供了两种风格:面向过程(procedural)和面向对象(object-oriented)。面向过程风格的,HOperatorSet提供所有HALCON算子,其中HObject用于处理图像数据,HTuple用于处理控制数据;对于面向对象,像HDataCode2d、HMeasure和HShapeModel这样的类被提供用于核心功能。此外,图像数据的类,可以用HImage和HRegion。
下面代码展示了一个C#示例程序来读取一个图像并且应用基本的blob分析。
HImage image = new HImage("monkey");
HRegion region;
region = image.Threshold(128, 255);
4. 扩展HALCON
4.1. 扩展包(用户自定义算子)
HALCON很容易被新的算子扩展。尽管HALCON已经包含超过2000个用于处理各种任务的算子,但你仍可能需要新的算子以满足你的需求,例如,为了访问一个特殊的硬件或实现一种非传统的算法。为了做到这些,HALCON提供了 扩展包接口(extension package interface) ,它允许以扩展包的形式集成新算子(在C中实现)。它包含了一些预定义好的规则和宏,用于在C中简单处理图像和内存对象。一旦新的算子被成功集成,它就能像其它HALCON算子那样被使用。
4.2. 图像采集接口
使用的是相似的机制,图像采集接口使用动态库集成。它允许你集成未支持的图像采集设备,而无需进一步更改系统的其余部分。如何创建和集成一个图像采集接口在图像采集接口程序员手册中有详细描述。HALCON还带有一个模板源代码,可以用作集成基础。
4.3. I/O设备接口
同样类似,I/O接口也使用动态库集成。它允许你在不进一步改动系统的情况下,集成未支持的I/O设备。创建和集成一个I/O设备接口的方式在 %HALCONEXAMPLES%\io_integration\README.txt 详细描述。HALCON带有模板源代码,可以用作集成基础。
5. 限制
5.1. 一般限制
使用HALCON XL,HALCON以前的许多限制会被移除。下面列举了剩余的一些与使用HALCON进行典型应用程序开发相关的其余内容。
- 字符串处理:
- HALCON库不会在内部处理多字节的字符。在调用 set_system(‘filename_encoding’, ‘utf8’) 后,包含多字节字符的文件名会被支持。
- NaNs处理:
- 由于性能的原因,HALCON库不会检查输入数据的NaNs。输入为NaNs,可能会导致未知错误,甚至崩溃。
- 最大图像尺寸:
- HALCON:32768✖32768
- HALCON XL: 2 30 × 2 30 2^{30}×2^{30} 230×230
- 每个图像的最大通道数:
- 65535
- 坐标范围:
- HALCON: -32768至+32768
- HALCON XL: − 2 30 至 2 30 − 1 -2^{30}至2^{30}-1 −230至230−1
- 最大窗口数:
- 600
5.2. 计算设备相关的限制
目前,以下限制应用在计算设备的使用中。
基于纹理的算子被限制在显卡的最大尺寸。目前限制为 8192×8192 。下列是相关算子:
- projective_trans_image 和 projective_trans_image_size
- affine_trans_image 和 affine_trans_image_size
- polar_trans_image 、 polar_trans_image_inv 和 polar_trans_image_ext
- rotate_image
- mirror_image
- map_image
- image_to_world_plane
- change_radial_distortion_image
进一步的限制,如下
- 所有其它算子限制在最大分配块大小内,如 Tesla C2050上是200MB。
- edge_sub_pix 和 lines_gauss 在HALCON XL下不会被Open CL加速。
- edge_sub_pix 和 lines_gauss 在计算设备上需要大量内存。
5.3. 图像采集相关限制
- 采集接口的最大数量为128
- 每个采集接口打开句柄的最大数量为256
- 特定接口参数的最大数量为2048
5.4. OpenGL相关限制
使用OpenGL用于视觉化(visualization)的算子需要OpenGL 2.1、GLSL 1.2 和 OpenGL扩展 GL_EXT_framebuffer_object 和 GL_EXT_framebuffer_blit 。因此,这些算子无法通过Windows远程桌面或SSH转发使用。
5.5. 扩展包相关限制
- 参数的最大数量:
- 图像型输入参数:9
- 图像型输出参数:9
- 控制型输入参数:20
- 控制型输出参数:20