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 ...
随机推荐
- [DE] ML on Big data: MLlib
Pipeline的最终目的就是学会Spark MLlib,这里先瞧瞧做到心里有数:知道之后要学什么,怎么学. 首要问题 一.哪些机器学习算法可以并行实现? 四类算法:分类.回归.聚类.协同过滤 以及特 ...
- 月光宝盒之时间魔法--java时间的前生今世
月光宝盒花絮 “曾经有一份真诚的爱情摆在我的面前,但是我没有珍惜,等到了失去的时候才后悔莫及,尘世间最痛苦的事莫过于此.如果可以给我一个机会再来一次的话,我会跟那个女孩子说我爱她,如果非要把这份爱加上 ...
- kvm-web管理工具webvirtmgr
前言: 使用开源的虚拟化技术,对公司自有的少数服务器进行虚拟化,在满足业务需求的同时,并未增加投入,同时也避免了使用云主机的不便,技术层面,kvm是开源的虚拟化产品,虚拟化性能出众,更重要的是免费!! ...
- 素数路径Prime Path POJ-3126 素数,BFS
题目链接:Prime Path 题目大意 从一个四位素数m开始,每次只允许变动一位数字使其变成另一个四位素数.求最终把m变成n所需的最少次数. 思路 BFS.搜索的时候,最低位为0,2,4,6,8可以 ...
- 代码审计之CSRF原理及修复
在平时的测试中,csrf也是比较容易发现的,主要就是看它对一个操作,有没有检测其时效性(这样表述可能不太准确),一般的防护方法就是添加token来进行校验,并及时对其进行失效处理. 以下所有代码都是我 ...
- 从壹开始学习 NetCore 新篇章 ║ Blog.Core 开发社之招募计划书
宫 哈喽大家好,国庆马上就要来了,在新的第四季度来临之际,祝大家年末能顺顺利利,解决所有的难题.大家可能从我的标题里也能看的出来,老张又要耍花样,搞事情了,近来随着 netcore 3.0 的正式推出 ...
- vue知识点整理
1.对于mvvm的理解 mvvm是model-view-viewModel vue是以数据为驱动的,vue自身将dom和数据进行绑定,一旦创建绑定,dom和数据将保持同步,每当数据发生变化,dom也会 ...
- Android Studio [ListView]
ListViewActivity.java package com.xdw.a122.listview; import android.app.Activity; import android.os. ...
- Spark的Java开发环境构建
为开发和调试SPark应用程序设置的完整的开发环境.这里,我们将使用Java,其实SPark还支持使用Scala, Python和R.我们将使用IntelliJ作为IDE,因为我们对于eclipse再 ...
- 聚类算法之K-means
想想常见的分类算法有决策树.Logistic回归.SVM.贝叶斯等.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应.但是很多时候上述条件得不到满 ...