2、初识Halcon程序

  1. 源码:

* 关闭窗口更新,每次对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')

 

  1. 语句的分类:
    1. 绿色:注释
    2. 褐色:控制和开发算子
    3. 蓝色:图像获取和处理算子
    4. 浅蓝色:外部函数

    注:褐色的控制和开发算子都可以在算子的"控制"、"开发"中查找。如下图

        控制是一些变成语言常见的语句

        开发语句都是以dev开头的。

     

  2. 程序中算子的结构:

    算子名(图像数据输入:图像数据输出

    控制输入 :控制输出)

    注:图像数据:图像数组和数据,例如regions,images和XLD

        Tuple:tuple是halcon特有的数据结构,可以存储大量不同类型的数据,可用于图形数据和控制变量。Tuple

        是Halcon与外界程序数据交互的通道。

  1. bin_threshold (Clip, Dark)

    自动阈值操作,适合背景是白色,提取的目标物体时黑色的情景。第一个参数为它的源图像。第二个参数是处理后的结果,它的类型不是图像类型,而是一个区域Region,region是一个图像的点集的集合,没有灰度值。类似于二值图像。他的大小不受图片大小限制。

    注:这个是自动的求出阈值并处理出结果,其实其背后进行了高斯滤波,并通过灰度直方图并自动选择一个合适的阈值。

    (1)、也可以使用自动阈值,使用自己调节的阈值:

            ①在程序没运行到自动阈值时,注释使用自动阈值

            ②点击灰度直方图助手

            ③点击实时显示

            ④插入代码

            注意:红色双向箭头表示选中该区域,即图像窗口中的红色标记的区域。

                当点击插入代码时,程序编辑器中自动插入:

                    ……………..

    ……………..

                    stop ()

    threshold (Clip, Regions, 0, 113)

                    ……………..

    ……………..

     

  2. 当执行完bin_threshold (Clip, Dark)时,图形窗口如下,这是红色区域就是Dark变量(region类型),当右键点击图形窗口个------颜色数量------12,它不会改变颜色。因为它们是一个整体。

    红色区域就是一个整体region,黑色覆盖的区域可以理解为透明的。当与Clip图像叠加显示时,只会拿红色部分叠加。

  3. 连通域操作

    由于Dark变量中的区域是一个整体,若想对每个连通域(每个回形针)进行操作,必须要对分割它们。

    connection (Dark, Single),当执行完连通域操作后,就可以把他们每个回形针分开成一个独立的整体,这时右键单击图形窗口中的颜色数量,就可以看到用不同的颜色表示效果了。

  4. select_shape (Single, Selected, 'area', 'and', 5000, 10000)

    以上操作以后吧每个独立的连通域已经分开,细心的可以发现,图像窗口最坐标也有一个小的连通域,这个连通域不是我们感兴趣的,所以通过面积的大小来筛选掉。效果如下。

    注:这个函数也像第3点中自动设置阈值的方法得到的。

    ①像这种通过判断选择区域的,要设置为一种颜色,方便查看那个被舍弃掉

    ②实时显示

    ③插入代码

    注:选择的物体是双向箭头内的物体,被舍弃的用其他(与①不同的颜色)颜色来表示。

        由于图像中面积最大值是6916,最大值不能再往右边拖动。假如需要修改更大的最大值,可以插入代码后在

        代码中修改。

  1. dev_set_draw ('fill')

*把上面程序中所以得region类型的变量设置样式,'fill'---填充型 'margin'----轮廓边缘线型

  1. 数组的大小:

    通过在数组名两边加 | | 就可以求出数组大小

    如: dd :=|Phi|

posted @ 2022-04-30 20:44  ihh2021  阅读(769)  评论(0编辑  收藏  举报