Halcon 入门:XL 版本、算子签名和第一个程序
2023 年 2 月 14 日 · 3 分钟读完
刚开始学 Halcon 时的几篇短笔记,合成一篇。
Halcon 和 Halcon XL
安装后会看到两个 HDevelop:

区别在于能处理的图像大小:
- Halcon:图像宽高都不超过 32768 像素,日常用这个;
- Halcon XL:支持超过 32768 × 32768 的大图(比如线扫相机拼出来的长图),内部用更大的数据类型,同样的图会慢一点、占更多内存。
在 C# 里调用时也对应两套库:halcondotnet.dll 和 halcondotnetxl.dll(底层分别是 halcon.dll 和 halconxl.dll),用哪套就引用哪套:

算子签名里的三个冒号
在 HDevelop 里看算子的参数列表,不管有没有参数,总有三个冒号:

这是 Halcon 规定的参数分区,四个区依次是:
算子名( 图像输入 : 图像输出 : 控制输入 : 控制输出 )
- 图像(iconic)参数:Image(图像)、Region(区域)、XLD(亚像素轮廓);
- 控制(control)参数:数字、字符串、元组(tuple)、句柄等。
经典例子:
threshold( Image : Region : MinGray, MaxGray : )
- 第一个冒号前是
Image:图像输入; - 第二个冒号前是
Region:图像输出,阈值分割的结果; - 第三个冒号前是
MinGray, MaxGray:两个控制输入; - 最后为空:没有控制输出。
看懂了这个,查任何算子都知道哪些是要传进去的、哪些是拿回来的。导出成 C# 时也是同样的顺序:HOperatorSet.Threshold(image, out region, minGray, maxGray)。
dev_open_window:打开图形窗口
dev_open_window( : : Row, Column, Width, Height, Background : WindowHandle )
打开一个新的图形窗口,并让它成为活动窗口,之后 dev_display 和算子结果的自动显示都会输出到这里。
| 参数 | 说明 |
|---|---|
| Row、Column | 窗口左上角的位置,默认 0 |
| Width、Height | 窗口大小,默认 512;传 -1 使用默认大小 |
| Background | 背景颜色,默认 'black' |
| WindowHandle | 输出:窗口句柄,后面在这个窗口上画东西都要用它 |
Halcon 的图像坐标:原点在左上角,Row(行)向下增大,Column(列)向右增大。注意参数顺序是先行后列,也就是先 Y 后 X,和 C# 里 Point(x, y) 相反,转换时最容易写反。
常用的搭配是按图像比例开窗口:
read_image (Image, 'printer_chip/printer_chip_01')
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_display (Image)
dev_close_window:关闭窗口
dev_close_window( : : : )
没有参数,关闭当前活动的图形窗口,相当于点窗口的关闭按钮。程序开头常写一句 dev_close_window (),把上次运行留下的窗口关掉。
dev_开头的算子只在 HDevelop 里有效,导出成 C# 代码时会被忽略或注释掉。C# 里显示图像要用 HWindowControl 和HOperatorSet.DispObj,见 在 HWindow 上显示文字。
read_image:读图
read_image( : Image : FileName : )
读取 FileName 指定的图像文件。FileName 是一个路径时得到一张图;传一个路径的元组,得到的是多张图组成的图像元组。
- 不写扩展名时,Halcon 会依次尝试各种格式;
- 不写完整路径时,会在 Halcon 的图像目录(例程图片所在的
images文件夹)里找,所以例程里能直接写'printer_chip/printer_chip_01'; - 支持的格式:
.hobj、.ima、.tif、.tiff、.gif、.bmp、.jpg、.jpeg、.jp2、.jxr、.png、.pcx、.ras、.xwd、.pbm、.pnm、.pgm、.ppm。
延伸
- 一个最小的检测程序:读图 →
threshold阈值分割 →connection把区域拆成连通块 →select_shape按面积筛选 →area_center得到面积和中心。大部分入门例程都是这个套路。 - 看帮助:在 HDevelop 里选中算子按 F1,帮助里有参数的取值范围和例程链接,比网上的翻译准。
- 找例程:文件 → 浏览 HDevelop 示例程序,可以按「方法」「行业」筛选,学一个算子最快的方法是找它的例程跑一遍。
- 接着看:HDevelop 的语法、Halcon 在 C# 里的数据类型转换。
原文首发于 blog.csdn.net