Halcon一日一练:获取孔位


本例程是用于获取安装螺丝孔在图像中对应的坐标位置,并显示该坐标位,如上图所示。
read_image(Image,'rim.png')//读取图像
dev_close_window()//关闭窗口
get_image_size(Image, Width, Height)//获取图像大小
dev_open_window(,,Width/, Height/, 'blue', WindowHandle)
dev_display(Image)
threshold(Image, Regions, , )//对图像进行二值化处理
connection(Regions, ConnectedRegions)//将区域进行分开
dev_clear_window()//清除窗口
dev_set_draw('margin')//显示区域的填充方式(不填充)
dev_set_line_width()//设置区域显示框的线宽
dev_display(Image)
area_center(SelectedRegions,Area, Rows, Columns)//获取孔的面积和中心坐标
index:=|Rows|//获取孔的数量 *依次对指定孔进行坐标显示
for i:= to (index-) by
messagex:='第'+'孔的坐标为:'+Rows[i]
messagey:='第'+'孔的坐标为:'+Columns[i]
disp_message(WindowHandle, messagex+messagey, 'window', , , 'blue', 'true')//显示坐标孔
disp_message(WindowHandle, i+, 'image', Rows[i]-, Columns[i]-, 'red', 'false')//指定孔
stop()//暂停 endfor
通过上面的代码,我们先把初始图像和已经获取的对应坐标的图像显示出来,并把对应的四个空坐标显示在图像窗口的左上角,这样能够更加直观的表达我们所做的工作。
在这里,我们需要注意几个技巧,当我们的代码写到下面这句时:
threshold(Image, Regions, , )//对图像进行二值化处理
该语句对图像进行二值化分割操作,将需要的图像区域通过灰度区间范围的方式进行分割操作,其分割对应的值范围为25-121灰度区间。我们通过打开灰度直方图对话框能够看到,图像中不同灰度对应的直方图显示器对应的数量。

二值化处理过程中,我们如何来设置图像的灰度门槛值呢,在这里我们可以通过HDevelop系统中的灰度直方图,我可以在工具栏
,会显示灰度直方图,这时我们对阀值前面按键按下让其显示打勾,我们在阀值列表会将图像的灰度排列值以直方图的形式显示出来,我们将鼠标拉动阀值线就可以改变灰度阀值,图中25为阀值的下限,121为上限。
阀值区间线的调整,能够改变图像二值化的上下限阀值,该值能够实时的观察图像的二值化分割区间,调整该线的位置,图像的灰度值区间将根据值而变化,通过这种办法,能够实时的观察我们所需要的区间。
在拉动阀值线的过程中,我们可以观察图像的变化,会看到根据区间的变化,图像中显示的区域也随之变化,通过多次调节,我们就能够获取四个孔独立的显示出来。这个时候,我们认为这就是我们想要的阀值,这个时候我们可以点击插入代码按键,并关闭阀值处理前面的按键,使其为红色的打叉状态,我们就可以回到程序编辑器中,继续编写我们的代码。
另外一句代码是在区域对进行选择的时候,我们要对区域的特征进行筛选,我们是通过选择孔所对应的区域来提取区域的四个孔,这个时候我们要如何操作呢?
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', , )//选择孔面积大小的区域
对应的孔的面积我们是不知道的,我们现在设置的是1600到6000个像素位,可是如何获取这个像素的区间呢,我们现在打开菜单工具栏中的
按键,会跳出特征检测对话框,我们可以通过调节该对话框来快速的设置区域的属性,并设置我们想要的阀值。

这个时候我们在特征选择中选择Region,在其下列选择框依次选择basic和area,说明我们要对区域的基本属性进行提取,当然我们现在是要对区域数组中提取孔的面积,所以我们现在只要在connection函数分离的变量Regions区域数组中提取对应的孔,我们通过鼠标选取四个孔,每选取一个孔,我们在特征检测对话框中会发现area的值会显示出来,他们依次是5147,1633,4616,1600个像素位数,这个时候我们可以将select_shape最小区域满足在1600至5147之间,当前我们可以适当的修正这两个值,以获得最佳区间范围,而不至于提取了我们不该提取的区域。
这种操作你会发现我们能够快速的找到对应的面积区域,从而准确的提取我们想要的四个孔,剩下的工作就是获取该四个孔的区域中心位置,area_cente函数帮助我们提取了四个孔的面积和坐标,并以数组的形式显示在变量窗口中,我们发现我们提取了四个孔,同时也获得了对应的四个坐标位置,接下来的就是如何把这四个孔的数据显示出来。
程序使用了循环语句
for i:= to index- by
... stop()
endfor
在例子中我们使用了一个循环操作,循环体是由for打头,endfor结束,我们采用|Rows|来获取数组的个数,数组的第一个数据是由0开始,所以我们必须以|Rows|-1开始,显示的数据信息是指定对应孔的坐标,这个数据信息我们先进行整合:
messagex:='第'+'孔的坐标为:'+Rows[i]
messagey:='第'+'孔的坐标为:'+Columns[i]
即messagex变量代表了孔对应的row坐标数据,messagey变量代表了孔对应的column坐标数据,最后我们在图像的左上角(0,0代表了左右)
Halcon一日一练:获取孔位的更多相关文章
- Halcon一日一练:读取文件目录图像的三种方法
第一种方法: 读了一个单一图像: read_image(Image,'fabrik') 这种方式可以快速的读取软件自身携带的库图像文件,系统设定了库图像映像文件的快速读取方式,我们也可以通过绝对地址的 ...
- Halcon一日一练:获取程序运行时间
很多时候,我们需要知道每个函数的运算周期,以提高程序的运行效率.知道运行时间对于图像算法处理很重要 Halcon提供相关的算子,我们先来看代码: **获取图像处理时间 read_image(Image ...
- Halcon一日一练:图像分辨率与像素
1.图像像素: 像素是指由图像的小方格即所谓的像素(pixel)组成的,这些小方块都有一个明确的位置和被分配的色彩数值,而这些一小方格的颜色和位置就决定该图像所呈现出来的样子.像素是构成图像的基本单元 ...
- Halcon一日一练:CAD类型的相关操作
大很多场合,需要在视觉程序中导入CAD文档,比如,在3C行业,需要对手机外壳进行CNC加工,或者点胶操作,此时,需要获取产品的各个点的数据.如果将CAD直接导入,就会大的减少编程工作量,同时也能达到很 ...
- Halcon一日一练:图像拼接技术2:步骤与例程
上一篇主要介绍了图像拼接的一些原理和方法,这一篇将主要介绍步骤和例程: 接上一篇: 基于特征的接拼方法,分为四个步骤 1.特征检测:从图像中检测出显著且独特的图像特征,诸如:闭合区域,直线段,边缘,轮 ...
- Halcon一日一练:图像设备介绍
Halcon在设计之初就提供了完整的图像采集方案,适应了多种图像设备采集图像,以及各种不同环境的采集方案. 通常情况下,图像的采集应该是所有机器视觉项目首要解决的任务,不幸的是,需要解决图像采集的问题 ...
- Halcon一日一练:创建三通道图像
首先理解一个什么是三通道图像: 三通道图像就是彩色图像,我们之前黑白相机或黑白电视机都是彩用的灰阶图像,即单通道图像,一般是2的8次方个灰阶,即256个灰阶.彩色图像采用RGB,红绿蓝三个通道来合成彩 ...
- Halcon一日一练:Halcon异常判断方法
1.TryCatch tryCatch处理的方式如下: try *可能会出现错误的语句 .... catch(Exception) *获取错误代码 ErrorCode:=Exception[] **对 ...
- Halcon一日一练:图像、变量实时更新
某些场合,我们需要刷新图像来识别图像处理过程的差异性,便于调试判断问题和预测.Halcon提供了图像刷新操作,这些操作不会改变程序的最终处理结果. 例程: **实时刷新图像 dev_update_wi ...
随机推荐
- Jenkins 持续集成安装及使用简介
博客地址:http://www.moonxy.com 一.前言 持续集成(Continuous integration,简称CI)指的是,频繁地(一天多次)将代码集成到主干. 持续集成的目的,就是让产 ...
- CTC安装错误之:binding.cpp:6:29: fatal error: torch/extension.h: No such file or directory
错误原因:该问题主要由于CTC的版本导致. 解决方法: 在终端打开warp-ctc文件夹: cd warp-ctc 然后:git checkout ac045b6072b9bc3454fb9f9f17 ...
- 谈谈HTTPS安全认证,抓包与反抓包策略
文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信 ...
- GS-PON数据库分区列范围查询优化案例
查询慢的SQL: with p as( select np.nodecode , np.nodename, d.deviceid, d.devicename, d.loopaddress, p.res ...
- [Linux] Telnet提示:Unable to connect to remote host: No route to host
出错现象: [root@localhost ~]# telnet 192.168.1.128 Trying 192.168.1.128...telnet: connect to address 192 ...
- 【linux】【jenkins】自动化运维四 整合gitlab、docker发布java项目
jenkins发布java项目 过程参考发布vue项目.https://www.cnblogs.com/jxd283465/p/11543431.html 大同小异. vue建立的是Freestyle ...
- word2vec之tensorflow(skip-gram)实现
关于word2vec的理解,推荐文章https://www.cnblogs.com/guoyaohua/p/9240336.html 代码参考https://github.com/eecrazy/wo ...
- Vue.js+vue-element搭建属于自己的后台管理模板:Vue.js快速入门(二)
Vue.js+vue-element搭建属于自己的后台管理模板:Vue.js快速入门(二) 前言 上篇文章对Vue.js有了初步理解,接下来我们把Vue.js基础语法快速的过一遍,先混个脸熟留个印象就 ...
- easyui-datetimebox 控件绑定双击事件实现自动选中当前日期时间
本方法是在不改变原 js 的情况下,通过扩展方法来实现本目的 首先在 datetimebox 控件中扩展一个 绑定双击事件 的方法 $.extend($.fn.datetimebox.methods, ...
- Java源码跟踪阅读技巧
转:https://www.jianshu.com/p/ab865109070c 本文基于Eclipse IDE 1.Quick Type Hierarchy 快速查看类继承体系. 快捷键:Ctrl ...