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 ...
随机推荐
- 在阿里云服务器CentOS7安装mysql提示“No package mysql-server available上安装mysql遇到的问题
1:安装mysql的时候:执行以下语句出现错误 yum install mysql-server 提示错误: 原因是: CentOS7带有MariaDB而不是MySQL,MariaDB和MySQL一样 ...
- 360大牛 全面解读 PHP面试
360大牛全面解读PHP面试 第1章 课程介绍 让大家了解基本面试流程和面试的核心要求以及意义是什么并理解PHP面试考点主要以基础为核心,说明PHP面试考察范围. 第2章 PHP基础知识考察点 本章主 ...
- Day 22 进程管理2之系统的平均负载
1.管理进程状态 当程序运行为进程后,如果希望停止进程,怎么办呢? 那么此时我们可以使用linux的kill命令对进程发送关闭信号.当然除了kill.还有killall,pkill 1.使用kill ...
- px、em、rem、%、vw、vh、vm这些单位的区别
1.px px就是像素,也是我们现在经常使用的基本单位,比如常常听到的电脑像素是1024x768的,表示的是水平方向是1024个像素点,垂直方向是768个像素点. 2.em em参考物是父元素的fon ...
- SpringBoot 2.0 + InfluxDB+ Sentinel 实时监控数据存储
前言 阿里巴巴提供的控制台只是用于演示 Sentinel 的基本能力和工作流程,并没有依赖生产环境中所必需的组件,比如持久化的后端数据库.可靠的配置中心等.目前 Sentinel 采用内存态的方式存储 ...
- 大白话讲解 Java程序的运行机制和JVM
据我们所知,Java程序是跨平台的.那么Java是如何实现跨平台的呢?看完下面几句话就会恍然大悟! 1.为什么Java语言既是编译型语言又是解释型语言呢? 答:运行Java程序,首先需要经过编译,编译 ...
- Mybatis源码解析,一步一步从浅入深(四):将configuration.xml的解析到Configuration对象实例
在Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码中我们看到了XMLConfigBuilder(xml配置解析器)的实例化.而且这个实例化过程在文章:Mybatis源码解析,一步一步从浅 ...
- 【数据结构与算法】--JavaScript 链表
一.介绍 JavaScript 原生提供了数组类型,但是却没有链表,虽然平常的业务开发中,数组是可以满足基本需求,但是链表在大数据集操作等特定的场景下明显具有优势,那为何 JavaScript 不提供 ...
- 如何编写出高质量的 equals 和 hashcode 方法?
什么是 equals 和 hashcode 方法? 这要从 Object 类开始说起,我们知道 Object 类是 Java 的超类,每个类都直接或者间接的继承了 Object 类,在 Object ...
- Python的未来发展方向
Python是一种跨平台的计算机程序设计语言. 是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的开发. ...