2、初识Halcon程序
- 源码:
* 关闭窗口更新,每次对Clip图片操作的效果就不会再图形窗口中显示,只有手动用代码显示图片到图形窗口中才显示
dev_update_window ('off')
* 假如dev_update_window ('on')时,即没有关闭更新,但运行完这一行后它就自动地显示Clip图片到显示窗口上了
read_image (Clip, 'clip')
*获取图片大小,可以再变量窗口中查看这些变量的大小
get_image_size (Clip, Width, Height)
*关闭图形窗口
dev_close_window ()
*打开指定的大小图形窗口
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowID)
*手动用代码显示Clip图片
dev_display (Clip)
*set_display_font设置字体样式,它是外部函数
set_display_font (WindowID, 14, 'mono', 'true', 'false')
*在界面右下角显示Press Run (F5) to continue字体提示用户继续点击F5,往下一般用stop ()语句停止
disp_continue_message (WindowID, 'black', 'true')
stop ()
*自动阈值,Clip为源变量,Dark为目标变量,它的类型不是图像而是区域。
bin_threshold (Clip, Dark)
connection (Dark, Single)
select_shape (Single, Selected, 'area', 'and', 5000, 10000)
*把上面程序中所以得region类型的变量设置样式,'fill'---填充型 'margin'----轮廓边缘线型
dev_set_draw ('fill')
dev_set_colored (12)
dev_display (Selected)
disp_continue_message (WindowID, 'black', 'true')
stop ()
*以'green'颜色显示Selected区域
dev_display (Clip)
dev_set_color ('green')
dev_display (Selected)
*通过端点计算出每个回形针的角度,并存放在Phi数组里面
orientation_region (Selected, Phi)
*计算出每个回形针连通域的面积和中心坐标,面积存放在Area中,中心坐标存放在Row, Column数组中
area_center (Selected, Area, Row, Column)
*设置线条宽度以及填充样式,便于以下绘画箭头的线条
dev_set_line_width (3)
dev_set_draw ('margin')
*箭头长度
Length := 80
*循环遍历每个连通域,通过Phi中的角度方向画出它的箭头,其中|Phi|表示数组的大小
for i := 0 to |Phi|-1 by 1
*颜色
dev_set_color ('blue')
*画箭头
disp_arrow (WindowID, Row[i], Column[i], Row[i]-Length*sin(Phi[i]), Column[i]+Length*cos(Phi[i]), 4)
*箭头标记字体
disp_message (WindowID, deg(Phi[i])$'3.1f'+' deg', 'image', Row[i], Column[i]-100, 'black', 'false')
endfor
dev_update_window ('on')
- 语句的分类:
- 绿色:注释
- 褐色:控制和开发算子
- 蓝色:图像获取和处理算子
- 浅蓝色:外部函数
注:褐色的控制和开发算子都可以在算子的"控制"、"开发"中查找。如下图
控制是一些变成语言常见的语句
开发语句都是以dev开头的。
- 程序中算子的结构:
算子名(图像数据输入:图像数据输出
控制输入 :控制输出)
注:图像数据:图像数组和数据,例如regions,images和XLD
Tuple:tuple是halcon特有的数据结构,可以存储大量不同类型的数据,可用于图形数据和控制变量。Tuple
是Halcon与外界程序数据交互的通道。
- bin_threshold (Clip, Dark)
自动阈值操作,适合背景是白色,提取的目标物体时黑色的情景。第一个参数为它的源图像。第二个参数是处理后的结果,它的类型不是图像类型,而是一个区域Region,region是一个图像的点集的集合,没有灰度值。类似于二值图像。他的大小不受图片大小限制。
注:这个是自动的求出阈值并处理出结果,其实其背后进行了高斯滤波,并通过灰度直方图并自动选择一个合适的阈值。
(1)、也可以使用自动阈值,使用自己调节的阈值:
①在程序没运行到自动阈值时,注释使用自动阈值
②点击灰度直方图助手
③点击实时显示
④插入代码
注意:红色双向箭头表示选中该区域,即图像窗口中的红色标记的区域。
当点击插入代码时,程序编辑器中自动插入:
……………..
……………..
stop ()
threshold (Clip, Regions, 0, 113)
……………..
……………..
- 当执行完bin_threshold (Clip, Dark)时,图形窗口如下,这是红色区域就是Dark变量(region类型),当右键点击图形窗口个------颜色数量------12,它不会改变颜色。因为它们是一个整体。
红色区域就是一个整体region,黑色覆盖的区域可以理解为透明的。当与Clip图像叠加显示时,只会拿红色部分叠加。
- 连通域操作
由于Dark变量中的区域是一个整体,若想对每个连通域(每个回形针)进行操作,必须要对分割它们。
connection (Dark, Single),当执行完连通域操作后,就可以把他们每个回形针分开成一个独立的整体,这时右键单击图形窗口中的颜色数量,就可以看到用不同的颜色表示效果了。
- select_shape (Single, Selected, 'area', 'and', 5000, 10000)
以上操作以后吧每个独立的连通域已经分开,细心的可以发现,图像窗口最坐标也有一个小的连通域,这个连通域不是我们感兴趣的,所以通过面积的大小来筛选掉。效果如下。
注:这个函数也像第3点中自动设置阈值的方法得到的。
①像这种通过判断选择区域的,要设置为一种颜色,方便查看那个被舍弃掉
②实时显示
③插入代码
注:选择的物体是双向箭头内的物体,被舍弃的用其他(与①不同的颜色)颜色来表示。
由于图像中面积最大值是6916,最大值不能再往右边拖动。假如需要修改更大的最大值,可以插入代码后在
代码中修改。
- dev_set_draw ('fill')
*把上面程序中所以得region类型的变量设置样式,'fill'---填充型 'margin'----轮廓边缘线型
- 数组的大小:
通过在数组名两边加 | | 就可以求出数组大小
如: dd :=|Phi|