文章首发于我的 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 下载安装步骤如下所示:

  1. 进入 HALCON 官网,选择产品版本、操作系统以及架构后就会下载对应版本软件直接点击下载好的安装包即可安装。
  2. 安装的详细步骤截图如下所示,试用版不用安装 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, &region, 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_channelwrite_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 类

  1. **图形窗口: **显示(中间)结果。即显示图像、区域和 XLD 等标志性数据。
  2. **程序窗口: **即输入和编辑代码的地方。
  3. 变量窗口: 显示所有变量。即显示图标变量(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 快速入门教程的更多相关文章

  1. 专为设计师而写的GitHub快速入门教程

    专为设计师而写的GitHub快速入门教程 来源: 伯乐在线 作者:Kevin Li     原文出处: Kevin Li 在互联网行业工作的想必都多多少少听说过GitHub的大名,除了是最大的开源项目 ...

  2. EntityFramework6 快速入门教程

    EntityFramework6 快速入门教程 不得不说EF在国内实在是太小众,相关的技术文章真实屈指可数,而且很多文章都很旧了,里面使用的版本跟如今的EF6差别还是比较大.我刚开始弄这个的时候真是绕 ...

  3. Apple Watch开发快速入门教程

     Apple Watch开发快速入门教程  试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本A ...

  4. 指示灯组与3个复位按钮的介绍Arduino Yun快速入门教程

    指示灯组与3个复位按钮的介绍Arduino Yun快速入门教程 1.4.2  指示灯组 指示灯组的放大图如图1.5所示. 图1.5  指示灯组 各个指示灯对应的功能如下: q  RX:对应于0号端口, ...

  5. 游戏控制杆OUYA游戏开发快速入门教程

    游戏控制杆OUYA游戏开发快速入门教程 1.2.2  游戏控制杆 游戏控制杆各个角度的视图,如图1-4所示,它的硬件规格是本文选自OUYA游戏开发快速入门教程大学霸: 图1-4  游戏控制杆各个角度的 ...

  6. Query 快速入门教程

    Query 快速入门教程 http://www.365mini.com/page/jquery-quickstart.htm#what_is_jquery jquery常用方法及使用示例汇总 http ...

  7. Realm for Android快速入门教程

    介绍 如果你关注安卓开发的最新趋势,你可能已经听说过Realm.Realm是一个可以替代SQLite以及ORMlibraries的轻量级数据库. 相比SQLite,Realm更快并且具有很多现代数据库 ...

  8. CMake快速入门教程-实战

    http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/ http://blog.csdn.net/dbzhang800/article/detai ...

  9. .NET Core 快速入门教程

    .NET Core 快速学习.入门系列教程.这个入门系列教程主要跟大家聊聊.NET Core的前世今生,以及Windows.Linux(CentOS.Ubuntu)基础开发环境的搭建.第一个.NET ...

  10. .NET Core快速入门教程 2、我的第一个.NET Core App(Windows篇)

    一.前言 本篇开发环境?1.操作系统: Windows 10 X642.SDK: .NET Core 2.0 Preview 二.安装 .NET Core SDK 1.下载 .NET Core下载地址 ...

随机推荐

  1. 大模型时代的程序员:不会用AIGC编程,未来5年将被淘汰?

    作者 | 郭炜 策划 | 凌敏 前言 下面是一段利用 Co-Pilot 辅助开发的小视频,这是 Apache SeaTunnel 开发者日常开发流程中的一小部分.如果你还没有用过 Co-Pilot.C ...

  2. 利用Linux系统提供的和调度器相关的接口让进程或线程对某个处理器进行绑定

    目录 设置进程与CPU的亲和性 设置线程与CPU的亲和性 设置进程与CPU的亲和性 taskset命令允许你查看或设置运行中的进程的CPU亲和性(即该进程可以在哪些CPU上运行). 要将一个已经运行的 ...

  3. Git-HEAD 的含义

    在 Git 中,"HEAD" 是一个特殊的引用,它指向当前所处的分支或提交. 当你进行一些操作时,比如提交代码.切换分支等,HEAD 的指向会随之改变.下面是 HEAD 在不同情况 ...

  4. 关于没使用Mybatis 分页,分页sql默认执行count(0) 的问题

    之前的Impl 的方法 :selectFromList(String uid, Integer pageNum, Integer pageSize) 之后的Impl 的方法 :selectFromLi ...

  5. 首次在WebAPI中写单元测试

    xUnit 这次我使用的是xUnit测试框架,而不是VS自带的MSTest框架.在添加新建项目时选择xUnit测试项目就行了. 目前只体验到了一个差别,即xUnit可以使用特性向测试方法传参,而不用在 ...

  6. 我当年如何入门Linux的?-zdc的那些往事

    一.通信当年的疯狂 还记得09年初, 山寨机横行, 市场上手机主要还是塞班os, 小灵通还没有退出市场, 基于安卓的智能手机陆续推出. 没有王者荣耀,更没有微信, 小米的米聊还在ppt里: 那个时候网 ...

  7. Camera | 3.瑞芯微平台MIPI摄像头常用调试命令

    瑞芯微专栏 前面2篇我们讲解了camera的一些基础概念和知识. 本文主要讲述在瑞芯微平台上摄像头开发常用的调试命令. 0.环境 soc : rk3568 board: EVB1-DDR4-V10 软 ...

  8. RedisTemplate常用方法

    RedisTemplate常用方法 一.Redis常用的数据类型: String Hash List Set zSet Sorted set 二.RedisTemplate 常用 API 1. Str ...

  9. /etc/shells 文件解释

    /etc/shells 文件是 UNIX 和类 UNIX 操作系统中的一个文本文件,它列出了系统上认为是合法的.用户可以选择的 shell 的完整路径.这个文件对于系统安全和用户环境配置很重要. 以下 ...

  10. shiro的rememberMe各种漏洞一刀切解决

    rememberMe的低版本AES固定密码导致的漏洞,高版本仍然有被爆破,穷举的风险等.这种东西总是在安全检测的时候被拿出来说事儿,然而项目中并未开启rememberMe,也就是说压根不需要这个功能. ...