← 全部文章 机器视觉

Halcon 入门:XL 版本、算子签名和第一个程序

2023 年 2 月 14 日 · 3 分钟读完

目录
  1. Halcon 和 Halcon XL
  2. 算子签名里的三个冒号
  3. dev_open_window:打开图形窗口
  4. dev_close_window:关闭窗口
  5. read_image:读图
  6. 延伸

刚开始学 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# 里的数据类型转换。

# Halcon

原文首发于 blog.csdn.net