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代表了左右)

原文地址:https://www.cnblogs.com/amosyang/p/9288587.html