Halcon 入门教程(01)
这篇教程很简单,实现的功能是计算下图中曲别针的数量和每个曲别针的朝向。主要内容是翻译自Halcon 的帮助文档 “Chapter 4 Programming HDevelop”。
使用的图像如下:
这篇教程中我们假设 HDevelop 的各个参数都为默认值,通常新安装好的 HDevelop 所有的参数就都是默认值。如果不是的话可以通过下面的命令行方式将 HDevelop 的各个参数重置为默认值。
hdevelop -reset_preferences
首先打开 HDevelop ,如果我们调整过各个窗口的位置,则可以通过菜单命令 Window ⇒ Organize Windows 将各个窗口恢复原始位置。
加载图像
加载图像有多重方式,最简单的方式是把图像拖拽到 HDevelop 中。这时会自动弹出一个 Read Image 窗口,在这个窗口中可以设置一些基本的参数。
加载完成后会在 Program window 中显示对应的语句。当然我们也可以直接在这个窗口中输入这个语句。或者在 Operator Window 中输入 read_image,这时这个窗口会提供这个函数的功能解释,在这个 window 中还可以设置每个输入输出参数。
读取完图像后的第二个操作是阈值分割 threshold。同样在 Operator Window 中输入 threshold。按照下图设置参数,之后点击 apply 按钮。这时会直接执行这条语句,但是不会把这条语句加入到 Program Window 中。我们可以试着调整参数,通过 apply 按钮,直接获得当前参数的效果。在 graphics window 中可以很直观的看到结果,红色的区域就是通过 Threshold 选出的区域。确认参数之后点击 OK 按钮将该命令加入到 Program Window 中。
下一步操作是获取连通区域。 Halcon 有个非常好的功能就是可以给出建议的操作。菜单 Suggestions ⇒ Successors 会提示出 Threshold 之后经常跟着的命令。可以看到第一个就是 connection。执行 connection 的结果是获得各个连通区域。graphics window 中会用不同的颜色显示不同的连通区域。
Graphics window 有许多参数可以设置,在这个窗口上单击邮件,弹出的对话框如下图所示。
点击 Set Parameters 后打开如下对话框:
大家可以随便试试,各个参数的含义都比较简单。
鼠标放在 ConnectedRegions 变量上单击鼠标右键后会弹出如下的菜单。
点击 Select 可以看到每个 Region 的详细信息,总共有 98 个区域。
实际上我们没有这么多的曲别针,产生这么多的区域说明我们的 threshold 的参数不合适。下面就来研究如何能进一步优化 Threshold 参数。
菜单 Visualization/Tools → Gray Histogram 会打开 Gray Histogram 窗口。我们调整 threshold 时选中的区域会跟着变化。
通过这个 Gray Histogram 可以比较容易的选择合适的 Threshold。
调整 Threshold 参数后得到的区域少了很多,但是还是比曲别针的数量多。这就说明我们需要其他的方法了。 Halcon 提供了一个 Feature Histogram 功能,这个功能除了通过 Histogram 来划分区域还会使用 Region 的其他 Feature。对于我们这个 区别的需求来说,面积就是一个非常好用Feature,因为所有的曲别针都有几乎相同的面积。下面我们就来具体的操作。
菜单 Visualization/Tools → Feature Histogram 可以打开 Feature Histogram 窗口。按照下图中的参数设置就好。需要注意的是我用红色框框起来的区域。这块如果不是打勾状态,则 Insert Code 按钮就无法点击。
点击 Insert Code 后就会生成实际的代码:
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 6302.75, 8541.28)
我们还要计算每个曲别针的方向,这可以用下面这条语句:
orientation_region (SelectedRegions, Phi)
然后这条语句计算每个区域的面积和中心点坐标。
area_center (SelectedRegions, Area, Row, Column)
最后我们要把结果显示在屏幕上。首先在整个程序之前增加一条语句:
dev_close_window ()
这条语句的作用是关闭任何已经打开的图像窗口。再加一句:
dev_open_window (0, 0, 512, 512, ‘black’, WindowHandle)
这条语句新建一个窗口。我们后面可以通过 WindowHandle 来操作这个窗口。
下面是显示每一个曲别针的方向:
dev_disp_text (deg(Phi) + ' degrees', 'image', Row, Column, 'black', [], [])
输出的结果如下: