zoukankan      html  css  js  c++  java
  • Halcon一日一练:获取孔位

    本例程是用于获取安装螺丝孔在图像中对应的坐标位置,并显示该坐标位,如上图所示。

    read_image(Image,'rim.png')//读取图像
    dev_close_window()//关闭窗口
    get_image_size(Image, Width, Height)//获取图像大小
    dev_open_window(0,0,Width/1, Height/1, 'blue', WindowHandle)
    dev_display(Image)
    threshold(Image, Regions, 25, 121)//对图像进行二值化处理
    connection(Regions, ConnectedRegions)//将区域进行分开
     
    dev_clear_window()//清除窗口
    dev_set_draw('margin')//显示区域的填充方式(不填充)
    dev_set_line_width(3)//设置区域显示框的线宽
    dev_display(Image)
    area_center(SelectedRegions,Area, Rows, Columns)//获取孔的面积和中心坐标
    index:=|Rows|//获取孔的数量
    
    *依次对指定孔进行坐标显示
    for i:= 0 to (index-1) by 1
        messagex:=''+'孔的坐标为:'+Rows[i]
        messagey:=''+'孔的坐标为:'+Columns[i]
        disp_message(WindowHandle, messagex+messagey, 'window', 0, 0, 'blue', 'true')//显示坐标孔
        disp_message(WindowHandle, i+1, 'image', Rows[i]-15, Columns[i]-10, 'red', 'false')//指定孔
        stop()//暂停
        
    endfor

    通过上面的代码,我们先把初始图像和已经获取的对应坐标的图像显示出来,并把对应的四个空坐标显示在图像窗口的左上角,这样能够更加直观的表达我们所做的工作。

    在这里,我们需要注意几个技巧,当我们的代码写到下面这句时:

    threshold(Image, Regions, 25, 121)//对图像进行二值化处理

    该语句对图像进行二值化分割操作,将需要的图像区域通过灰度区间范围的方式进行分割操作,其分割对应的值范围为25-121灰度区间。我们通过打开灰度直方图对话框能够看到,图像中不同灰度对应的直方图显示器对应的数量。

    二值化处理过程中,我们如何来设置图像的灰度门槛值呢,在这里我们可以通过HDevelop系统中的灰度直方图,我可以在工具栏,会显示灰度直方图,这时我们对阀值前面按键按下让其显示打勾,我们在阀值列表会将图像的灰度排列值以直方图的形式显示出来,我们将鼠标拉动阀值线就可以改变灰度阀值,图中25为阀值的下限,121为上限。

    阀值区间线的调整,能够改变图像二值化的上下限阀值,该值能够实时的观察图像的二值化分割区间,调整该线的位置,图像的灰度值区间将根据值而变化,通过这种办法,能够实时的观察我们所需要的区间。

    在拉动阀值线的过程中,我们可以观察图像的变化,会看到根据区间的变化,图像中显示的区域也随之变化,通过多次调节,我们就能够获取四个孔独立的显示出来。这个时候,我们认为这就是我们想要的阀值,这个时候我们可以点击插入代码按键,并关闭阀值处理前面的按键,使其为红色的打叉状态,我们就可以回到程序编辑器中,继续编写我们的代码。

    另外一句代码是在区域对进行选择的时候,我们要对区域的特征进行筛选,我们是通过选择孔所对应的区域来提取区域的四个孔,这个时候我们要如何操作呢?

    select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 1600, 6000)//选择孔面积大小的区域

    对应的孔的面积我们是不知道的,我们现在设置的是1600到6000个像素位,可是如何获取这个像素的区间呢,我们现在打开菜单工具栏中的按键,会跳出特征检测对话框,我们可以通过调节该对话框来快速的设置区域的属性,并设置我们想要的阀值。

    这个时候我们在特征选择中选择Region,在其下列选择框依次选择basic和area,说明我们要对区域的基本属性进行提取,当然我们现在是要对区域数组中提取孔的面积,所以我们现在只要在connection函数分离的变量Regions区域数组中提取对应的孔,我们通过鼠标选取四个孔,每选取一个孔,我们在特征检测对话框中会发现area的值会显示出来,他们依次是5147,1633,4616,1600个像素位数,这个时候我们可以将select_shape最小区域满足在1600至5147之间,当前我们可以适当的修正这两个值,以获得最佳区间范围,而不至于提取了我们不该提取的区域。

    这种操作你会发现我们能够快速的找到对应的面积区域,从而准确的提取我们想要的四个孔,剩下的工作就是获取该四个孔的区域中心位置,area_cente函数帮助我们提取了四个孔的面积和坐标,并以数组的形式显示在变量窗口中,我们发现我们提取了四个孔,同时也获得了对应的四个坐标位置,接下来的就是如何把这四个孔的数据显示出来。

    程序使用了循环语句

    for i:= 0 to index-1 by 1
    ...
    
    stop()
    endfor

    在例子中我们使用了一个循环操作,循环体是由for打头,endfor结束,我们采用|Rows|来获取数组的个数,数组的第一个数据是由0开始,所以我们必须以|Rows|-1开始,显示的数据信息是指定对应孔的坐标,这个数据信息我们先进行整合:

     messagex:=''+'孔的坐标为:'+Rows[i]
     messagey:=''+'孔的坐标为:'+Columns[i]

    即messagex变量代表了孔对应的row坐标数据,messagey变量代表了孔对应的column坐标数据,最后我们在图像的左上角(0,0代表了左右)

  • 相关阅读:
    HDU 6182 A Math Problem 水题
    HDU 6186 CS Course 位运算 思维
    HDU 6188 Duizi and Shunzi 贪心 思维
    HDU 2824 The Euler function 欧拉函数
    HDU 3037 Saving Beans 多重集合的结合 lucas定理
    HDU 3923 Invoker Polya定理
    FZU 2282 Wand 组合数学 错排公式
    HDU 1452 Happy 2004 数论
    HDU 5778 abs 数论
    欧拉回路【判断连通+度数为偶】
  • 原文地址:https://www.cnblogs.com/amosyang/p/9288587.html
Copyright © 2011-2022 走看看