Halcon 快速入门教程
文章首发于我的 github 仓库-cv算法工程师成长之路,欢迎关注我的公众号-嵌入式视觉。
本人水平有限,文章如有问题,欢迎及时指出。如果看完文章有所收获,一定要先点赞后收藏。毕竟,赠人玫瑰,手有余香。
前言
工业智慧视觉应用主要涉及四个场景:识别、测量、定位、检测。
- 识别:识别物体的物理特征,包括形状、颜色、字符和条码等,常见的应用场景是 OCR,读取零部件上的字母、数字、字符等用于溯源。
- 测量:把获取到的图像像素信息标定成常用的度量衡单位,再通过精确计算出目标的几何尺寸。
- 定位:获取目标的二维/三维位置信息,常用语元件定位,用以辅助机器臂进行后续的抓取等动作。
- 检测:一般特指缺陷检测,判断产品是否存在缺陷,如零部件缺陷检测等。

一,HALCON 概述
HALCON 是德国 MVtec 公司开发的一款综合性的机器视觉标准软件,拥有全球通用的集成开发环境(HDevelop)。它节约了产品成本,缩短了软件开发周期——HALCON 灵活的架构便于机器视觉,医学图像和图像分析应用的快速开发。在欧洲以及日本的工业界已经是公认具有最佳效能的机器视觉(Machine Vision)软件。
MVTec 提供了 5 种软件:HALCON、MERLIC、深度学习工具、接口、嵌入式视觉,其中 HALCON 是最核心和应用最广的。
HALCON 主要提供的技术有:条形码和二维码读取、BLOB 分析、物图像分类、计算光学成像、过滤技术、缺陷检查、匹配、1D/2D/3D 测量、形态学处理、OCR 和 OCV、基于样本的识别(SBI)、亚像素边缘检测和线条提取技术、深度学习和 3D 视觉技术。
所谓 Blob 分析,即是从连通像素中提取具有相同逻辑状态的特征 (Blob)。
更多技术的描述请参阅官网资料。

1.1,HALCON 安装
注意:HALCON 目前不支持 arm 处理器版的 M1 Pro 机器,而且目前主流是在 Windows 开发居多。
注意,需要先在官网注册账号,然后才能下载对应软件,MVTec HALCON 提供两个不同的软件版本:HALCON 订阅版 (HALCON Progress) 和 HALCON 永久版 (HALCON Steady)。两个版本是完全独立的。 需要许可证,这意味着没有可能从一个版本 "切换" 到另一个版本。
HALCON 下载安装步骤如下所示:
- 进入 HALCON 官网,选择产品版本、操作系统以及架构后就会下载对应版本软件直接点击下载好的安装包即可安装。
- 安装的详细步骤截图如下所示,试用版不用安装
license文件,跳过即可。




二,HALCON 架构
HALCON 架构如下图 2.1 所示。HALCON 机器视觉软件的主要部分就是图像处理库,其由超过 2000 多个算子组成,当然我们也可以通过拓展包的形式开发自定义算子,并在程序中使用。

HALCON 提供了通用的图像采集接口来支持不同的图像采集设备(3D相机、相机等),包好特定设备的实现库会在程序运行时动态加载。
2.1,算子
Operators。
我们使用 HALCON 库中任何功能实际上都是通过算子(Operators)完成的,每个功能都有多种实现方法,其可以通过算子参数选择。完整的算子列表在 HALCON Operator Reference,其提供了 HDevelop, .NET, Python, C++, 和 C syntax 接口。HALCON库提供的算子的重要特征如下:
- 算子之间没有层次结构,所有算子都是一个级别的。
- 存在逻辑算子。
- 很多算子可以使用并行加速技术。
- 算子的输入输出参数的排序是有标准化规则: 输入图标(
iconic)、输出图标、输入控制和输出控制。
2.1.1,参数和数据结构
Quick Guide to HALCON Parameters and Data Structures
HALCON 算子的参数有两种基本类型:图标数据和控制数据(iconic data and control data)。图像、区域(regions)和 XLD(拓展线描述) 属于标志性数据。
- Images(图像)即包含像素值的矩阵,由多个通道组成,其详细定义可以参考《数字图像处理》书籍。这里感兴趣区域 ROI 指的是输入图像的哪一部分区域会被处理,ROI 可以灵活定义,从简单的矩形到一组未连接到像素点都支持。
- Regions 由一系列像素组成。区域之中的像素可以不互相连接,任意像素集合都可以作为单个区域处理。
- XLDS 包括所有基于轮廓和多边形的数据。像
edges_sub_pix这样的亚像素精度算子将轮廓作为 XLD 数据返回。 轮廓是一系列 2D 控制点,由线连接。 通常,控制点之间的距离约为 1 个像素。 除了控制点之外,XLD 对象还包含所谓的局部和全局属性。 这些的典型示例是,例如,控制点的边缘幅度或轮廓段的回归参数。 除了提取 XLD 对象外,HALCON 还支持进一步处理。 这方面的示例是基于给定特征范围的轮廓选择,用于将轮廓分割成线、弧、多边形或平行线。
控制数据(control data)包括句柄和基本数据类型,如整数、实数、字符串。
句柄是对复杂数据结构的引用,例如,与图像采集接口或基于形状匹配的模型的连接。 出于效率和数据安全的原因,在操作符之间传递的不是整个结构而是只有句柄。 句柄是不能更改的神奇值(magic values),并且可能因执行和版本而异。 一旦所有引用被覆盖,它们就会自动清除。 使用句柄的示例有图形窗口、文件、套接字、图像采集接口、OCR、OCV、测量和匹配。
2.2,拓展包
为了支持特殊硬件或实现新的算法,HALCON 支持以 C 语言实现的自定义算子。拓展包接口包含几个预定义的例程和宏,用于在 C 中轻松处理图像数据和内存对象。成功集成新算子后,它可以像任何其他 HALCON 算子一样使用。
2.3,接口
HALCON 支持Python、C、C++ 和 .NET 语言接口,对于·不同编程语言接口,其数据类型、类和算子的命名会有所不同。
2.3.1,HALCON-Python 接口
读取图像并计算连接区域(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}')
2.3.2,HALCON-C 接口
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);
2.3.3,HALCON-C++ 接口
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';
2.3.4,HALCON-.NET 接口
略
2.4,图像获取接口
HALCON 通过动态库(Windows: 动态加载库 DLLs, Linux: 共享库 shared libraries)的形式为 50 多个图像采集卡和数百个工业相机提供采集图像的接口。库名称以前缀 hAcq 开头;HALCON XL 使用以 xl 结尾的库。
HALCON 图像采集接口的更新会比 HALCON 库本身更新更为频繁。
成功安装好图像采集设备后,通过 open_framegrabber 算子(需配置设备的名称和其他信息)访问设备,通过 grab_image 算子获取图像。
2.5,I/O 接口
HALCON 对不同 I/O 设备使用同一类算子实现统一访问。安装好 I/O 设备后,使用 open_io_device 算子建立连接,指定 I/O 设备接口的名称;建立连接后,通过调用 open_io_channel 来打开传输通道,然后使用 read_io_channel 和 write_io_channel 算子读取和写入值。
三,如何开发应用
官方推荐使用 HDevelop(HALCON 机器视觉库的交互式开发环境) 进行快速原型设计。在开发好 HDevelop 程序后需要将其转换为最终环境,方法有以下三种:
- Start from Scratch: 从头(
scratch)开始编写程序意味着手动将 HDevelop 代码翻译成目标编程语言(C++、Python...)。 - 导出 HDevelop 代码: 使用 HDevelop 的代码导出功能将您的 HDevelop 代码自动翻译成目标编程语言。
- 导出库项目::HDevelop 的库导出会生成一个即用型项目文件夹,包括目标语言的包装代码和用于构建项目的
CMake文件。 HDevelop 的库导出使用HDevEngine,一个充当解释器的库。
3.1,HDevelop
默认情况下,HDevelop 窗口入下图 3.1 所示,窗口主要分为 3 类:
- **图形窗口: **显示(中间)结果。即显示图像、区域和 XLD 等标志性数据。
- **程序窗口: **即输入和编辑代码的地方。
- 变量窗口: 显示所有变量。即显示图标变量(
iconic variables)和控制变量。图标变量包含图标数据,控制变量包含控制数据。

3.2,示例程序
推荐观看视频教程: Integrate HDevelop code into a C++ application using the Library Project Export。
分步说明的描述可以参考 《quick_guide》 文档的3.2 节内容。
四,更多参考资料
HALCON 相关文档描述及下载链接汇总如下表所示。
| REFERENCE MANUAL 参考手册 | 下载链接 | 文件大小 |
|---|---|---|
| HALCON Operator Reference(HALCON 算子参考资料) | 下载 PDF 在线阅读 (需要 Javascript) |
24.8 MB |
| BASICS 基础知识 | 下载链接 | 文件大小 |
|---|---|---|
| Quick Guide(快速指南) | 下载 PDF | 2.6 MB |
| Installation Guide(安装指南) | 下载 PDF | 0.4 MB |
| HDevelop Users' Guide(HDevelop 用户指南) | 下载 PDF | 6.2 MB |
| Solution Guide I - Basics(解决方案指南 I - 基础知识) | 下载 PDF | 6.7 MB |
| Solution Guide II - A - Image Acquisition(解决方案指南 II-B - 图像采集) | 下载 PDF | 0.7 MB |
| Solution Guide II - B - Matching(解决方案指南 II-B - 匹配) | 下载 PDF | 3.4 MB |
| Solution Guide II - C - 2D Data Codes(解决方案指南 II-C - 二维码) | 下载 PDF | 4.6 MB |
| Solution Guide II - D - Classification(解决方案指南 II-D - 分类) | 下载 PDF | 4.3 MB |
| Solution Guide III - A - 1D Measuring(解决方案指南 III-A - 1D 测量) | 下载 PDF | 1.2 MB |
| Solution Guide III - B - 2D Measuring(解决方案指南 III-B - 2D 测量) | 下载 PDF | 2.5 MB |
| Solution Guide III - C - 3D Vision(解决方案指南 III-C - 3D 视觉) | 下载 PDF | 14.2 MB |
| Technical Updates(技术更新) | 下载 PDF | 0.2 MB |
本文由博客一文多发平台 OpenWrite 发布!
Halcon 快速入门教程的更多相关文章
- 专为设计师而写的GitHub快速入门教程
专为设计师而写的GitHub快速入门教程 来源: 伯乐在线 作者:Kevin Li 原文出处: Kevin Li 在互联网行业工作的想必都多多少少听说过GitHub的大名,除了是最大的开源项目 ...
- EntityFramework6 快速入门教程
EntityFramework6 快速入门教程 不得不说EF在国内实在是太小众,相关的技术文章真实屈指可数,而且很多文章都很旧了,里面使用的版本跟如今的EF6差别还是比较大.我刚开始弄这个的时候真是绕 ...
- Apple Watch开发快速入门教程
Apple Watch开发快速入门教程 试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本A ...
- 指示灯组与3个复位按钮的介绍Arduino Yun快速入门教程
指示灯组与3个复位按钮的介绍Arduino Yun快速入门教程 1.4.2 指示灯组 指示灯组的放大图如图1.5所示. 图1.5 指示灯组 各个指示灯对应的功能如下: q RX:对应于0号端口, ...
- 游戏控制杆OUYA游戏开发快速入门教程
游戏控制杆OUYA游戏开发快速入门教程 1.2.2 游戏控制杆 游戏控制杆各个角度的视图,如图1-4所示,它的硬件规格是本文选自OUYA游戏开发快速入门教程大学霸: 图1-4 游戏控制杆各个角度的 ...
- Query 快速入门教程
Query 快速入门教程 http://www.365mini.com/page/jquery-quickstart.htm#what_is_jquery jquery常用方法及使用示例汇总 http ...
- Realm for Android快速入门教程
介绍 如果你关注安卓开发的最新趋势,你可能已经听说过Realm.Realm是一个可以替代SQLite以及ORMlibraries的轻量级数据库. 相比SQLite,Realm更快并且具有很多现代数据库 ...
- CMake快速入门教程-实战
http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/ http://blog.csdn.net/dbzhang800/article/detai ...
- .NET Core 快速入门教程
.NET Core 快速学习.入门系列教程.这个入门系列教程主要跟大家聊聊.NET Core的前世今生,以及Windows.Linux(CentOS.Ubuntu)基础开发环境的搭建.第一个.NET ...
- .NET Core快速入门教程 2、我的第一个.NET Core App(Windows篇)
一.前言 本篇开发环境?1.操作系统: Windows 10 X642.SDK: .NET Core 2.0 Preview 二.安装 .NET Core SDK 1.下载 .NET Core下载地址 ...
随机推荐
- 实现一个终端文本编辑器来学习golang语言:第三章文本查看器part1
本章我们来完成文本编辑器的文件打开和查看功能,最后成品如上图.我们将分4步,逐渐完成本章所需功能.内容比较多,会分为两个部分,第一部分主要关注于"View视图"和"buf ...
- FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流
SRT Streamer是一个安卓手机端的开源SRT协议直播推流框架,可用于RTMP直播和SRT直播.SRT Streamer支持的视频编码包括H264.H265等等,支持的音频编码包括AAC.OP ...
- IE、Chrome、Firefox修改http header信息
在测试系统交互时,可能会碰到需要修改header信息的要求,下面介绍下如何在IE.Chrome.Firefox修改http header信息. 1.IE(fiddler) >在IE下修改head ...
- Excel 导入的开发经验
2020 年开始接触 Java Excel 导入的开发工作. 一家建筑机器人的公司离职后,来到广州找的是一家工厂,开始接触导入的开发工作.之前也没有什么使用开发经验, 是 教学视频 中看到过有些老 ...
- C++20新特性
C++20新特性 语言特性 协程 concept概念 指定初始化器 lambda表达式模板语义 范围for循环增加初始化器 [[likely]] [unlikely]属性 废弃隐式捕获this 非类型 ...
- 简单理解.net 依赖注入的三种方式
前言 :.NET5.0 于2020年11月10日正式发布,它是3.1之后的 .NET Core 的下一个主要版本.微软将这个新版本命名为 .NET 5.0 而不是 .NET Core 4.0,其原因有 ...
- LaTeX 插入表格
普通表格 \begin{table}[h] % h: here \begin{center} % 一个字母代表一列 \begin{tabular}{|c|cccc|} % c: center, l: ...
- 【Java】之获取CSV文件数据以及获取Excel文件数据
一.获取CSV文件数据 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Sheet; impor ...
- elementUI实现月、季度、年 时间选择框
elementUI实现月.季度.年 时间选择框 一.通过 el-date-picker 组件来实现月.年的选择 代码如下: <el-date-picker v-if="dateType ...
- TypeScript – Get Started Advanced (Work with SystemJS)
更新 我本来想 skip 掉 bundler (webpack), 感觉单侧不需要搞那么复杂, 所以用了 TypeScript 自带的 bundle (outFile) + SystemJS. 谁知道 ...