工业智慧视觉应用主要涉及四个场景:识别、测量、定位、检测。
HALCON
是德国 MVtec 公司开发的一款综合性的机器视觉标准软件,拥有全球通用的集成开发环境(HDevelop)。它节约了产品成本,缩短了软件开发周期——HALCON 灵活的架构便于机器视觉,医学图像和图像分析应用的快速开发。在欧洲以及日本的工业界已经是公认具有最佳效能的机器视觉(Machine Vision)软件。
MVTec 提供了 5 种软件:HALCON、MERLIC、深度学习工具、接口、嵌入式视觉,其中 HALCON 是最核心和应用最广的。
HALCON 主要提供的技术有:条形码和二维码读取、BLOB 分析、物图像分类、计算光学成像、过滤技术、缺陷检查、匹配、1D/2D/3D 测量、形态学处理、OCR 和 OCV、基于样本的识别(SBI)、亚像素边缘检测和线条提取技术、深度学习和 3D 视觉技术。
所谓 Blob 分析,即是从连通像素中提取具有相同逻辑状态的特征 (Blob)。
更多技术的描述请参阅官网资料。
注意:HALCON 目前不支持 arm 处理器版的 M1 Pro 机器,而且目前主流是在 Windows 开发居多。
注意,需要先在官网注册账号,然后才能下载对应软件,MVTec HALCON 提供两个不同的软件版本:HALCON 订阅版 (HALCON Progress) 和 HALCON 永久版 (HALCON Steady)。两个版本是完全独立的。 需要许可证,这意味着没有可能从一个版本 “切换” 到另一个版本。
HALCON 下载安装步骤如下所示:
license
文件,跳过即可。HALCON
架构如下图 2.1 所示。HALCON 机器视觉软件的主要部分就是图像处理库,其由超过 2000 多个算子组成,当然我们也可以通过拓展包的形式开发自定义算子,并在程序中使用。
HALCON
提供了通用的图像采集接口来支持不同的图像采集设备(3D相机、相机等),包好特定设备的实现库会在程序运行时动态加载。
Operators。
我们使用 HALCON 库中任何功能实际上都是通过算子(Operators
)完成的,每个功能都有多种实现方法,其可以通过算子参数选择。完整的算子列表在 HALCON Operator Reference,其提供了 HDevelop, .NET, Python, C++, 和 C syntax 接口。HALCON库提供的算子的重要特征如下:
iconic
)、输出图标、输入控制和输出控制。Quick Guide to HALCON Parameters and Data Structures
HALCON
算子的参数有两种基本类型:图标数据和控制数据(iconic data and control data)。图像、区域(regions
)和 XLD(拓展线描述) 属于标志性数据。
edges_sub_pix
这样的亚像素精度算子将轮廓作为 XLD 数据返回。 轮廓是一系列 2D 控制点,由线连接。 通常,控制点之间的距离约为 1 个像素。 除了控制点之外,XLD 对象还包含所谓的局部和全局属性。 这些的典型示例是,例如,控制点的边缘幅度或轮廓段的回归参数。 除了提取 XLD 对象外,HALCON 还支持进一步处理。 这方面的示例是基于给定特征范围的轮廓选择,用于将轮廓分割成线、弧、多边形或平行线。控制数据(control data
)包括句柄和基本数据类型,如整数、实数、字符串。
句柄是对复杂数据结构的引用,例如,与图像采集接口或基于形状匹配的模型的连接。 出于效率和数据安全的原因,在操作符之间传递的不是整个结构而是只有句柄。 句柄是不能更改的神奇值(magic values),并且可能因执行和版本而异。 一旦所有引用被覆盖,它们就会自动清除。 使用句柄的示例有图形窗口、文件、套接字、图像采集接口、OCR、OCV、测量和匹配。
为了支持特殊硬件或实现新的算法,HALCON 支持以 C 语言实现的自定义算子。拓展包接口包含几个预定义的例程和宏,用于在 C 中轻松处理图像数据和内存对象。成功集成新算子后,它可以像任何其他 HALCON 算子一样使用。
HALCON 支持Python、C、C++ 和 .NET 语言接口,对于·不同编程语言接口,其数据类型、类和算子的命名会有所不同。
读取图像并计算连接区域(connected regions
)数量的示例代码如下。
img = ha.read_image('pcb') region = ha.threshold(img, 0, 122) num_regions = ha.count_obj(ha.connection(region)) print(f'Number of Regions: {num_regions}')
C 接口是 HALCON 支持的最简单的接口,每个算子由 1 或 2 个全局函数表示,其中算子的名称和参数序列和 HDevelop 语言相同。
因为 HALCON 算子的本身就是由 C 语言实现的,所以 C 是原生接口,支持也是最好。
以下示例代码也是实现读取图像并计算连接区域(connected regions
)数量。
Hobject img; read_image(&img, "pcb"); Hobject region; threshold(img, ®ion, 0, 122); Hobject connected_regions; connection(region, &connected_regions); Hlong num_regions = 0; count_obj(connected_regions, &num_regions); printf("Number of Regions: %" PRIdPTR "\n", num_regions);
C++ 接口比 C 接口复杂得多,应用了 C++ 面向对象编程的优点,包括自动类型转换、构造和析构函数等。另外和 C 接口一样,也为每个 HALCON 算子提供了全局函数,来实现程序化的编程风格(a procedural style of programming)。
读取图像并计算连接区域(connected regions
)数量的 C++ 接口实现代码如下。
HImage img{"pcb"}; HRegion region = img.Threshold(0, 122); Hlong numRegions = region.Connection().CountObj(); std::cout << "Number of Regions: " << numRegions << '\n';
略
HALCON 通过动态库(Windows: 动态加载库 DLLs
, Linux: 共享库 shared libraries
)的形式为 50 多个图像采集卡和数百个工业相机提供采集图像的接口。库名称以前缀 hAcq
开头;HALCON XL 使用以 xl
结尾的库。
HALCON 图像采集接口的更新会比 HALCON 库本身更新更为频繁。
成功安装好图像采集设备后,通过 open_framegrabber
算子(需配置设备的名称和其他信息)访问设备,通过 grab_image
算子获取图像。
HALCON
对不同 I/O
设备使用同一类算子实现统一访问。安装好 I/O
设备后,使用 open_io_device
算子建立连接,指定 I/O 设备接口的名称;建立连接后,通过调用 open_io_channel
来打开传输通道,然后使用 read_io_channel
和 write_io_channel
算子读取和写入值。
官方推荐使用 HDevelop(HALCON 机器视觉库的交互式开发环境) 进行快速原型设计。在开发好 HDevelop 程序后需要将其转换为最终环境,方法有以下三种:
scratch
)开始编写程序意味着手动将 HDevelop 代码翻译成目标编程语言(C++、Python…)。CMake
文件。 HDevelop 的库导出使用 HDevEngine
,一个充当解释器的库。默认情况下,HDevelop
窗口入下图 3.1 所示,窗口主要分为 3 类:
iconic variables
)和控制变量。图标变量包含图标数据,控制变量包含控制数据。推荐观看视频教程: Integrate HDevelop code into a C++ application using the Library Project Export。
分步说明的描述可以参考 《quick_guide》 文档的3.2 节内容。