Halcon机器视觉实验指导书.docx

上传人:b****5 文档编号:14698837 上传时间:2023-06-26 格式:DOCX 页数:107 大小:8.61MB
下载 相关 举报
Halcon机器视觉实验指导书.docx_第1页
第1页 / 共107页
Halcon机器视觉实验指导书.docx_第2页
第2页 / 共107页
Halcon机器视觉实验指导书.docx_第3页
第3页 / 共107页
Halcon机器视觉实验指导书.docx_第4页
第4页 / 共107页
Halcon机器视觉实验指导书.docx_第5页
第5页 / 共107页
Halcon机器视觉实验指导书.docx_第6页
第6页 / 共107页
Halcon机器视觉实验指导书.docx_第7页
第7页 / 共107页
Halcon机器视觉实验指导书.docx_第8页
第8页 / 共107页
Halcon机器视觉实验指导书.docx_第9页
第9页 / 共107页
Halcon机器视觉实验指导书.docx_第10页
第10页 / 共107页
Halcon机器视觉实验指导书.docx_第11页
第11页 / 共107页
Halcon机器视觉实验指导书.docx_第12页
第12页 / 共107页
Halcon机器视觉实验指导书.docx_第13页
第13页 / 共107页
Halcon机器视觉实验指导书.docx_第14页
第14页 / 共107页
Halcon机器视觉实验指导书.docx_第15页
第15页 / 共107页
Halcon机器视觉实验指导书.docx_第16页
第16页 / 共107页
Halcon机器视觉实验指导书.docx_第17页
第17页 / 共107页
Halcon机器视觉实验指导书.docx_第18页
第18页 / 共107页
Halcon机器视觉实验指导书.docx_第19页
第19页 / 共107页
Halcon机器视觉实验指导书.docx_第20页
第20页 / 共107页
亲,该文档总共107页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Halcon机器视觉实验指导书.docx

《Halcon机器视觉实验指导书.docx》由会员分享,可在线阅读,更多相关《Halcon机器视觉实验指导书.docx(107页珍藏版)》请在冰点文库上搜索。

Halcon机器视觉实验指导书.docx

Halcon机器视觉实验指导书

机器视觉软件HALCON

实验指导书

实验1HALCON概述,应用范例

实验2HDevelop介绍,操作编程范例

实验3HALCON编程接口,高级语言编程

实验4HALCON数据结构,采集硬件接口

实验5HALCON采集硬件配置,图像采集

实验6HALCON二维测量,配准测量与识别定位

实验7HALCON一维测量,尺寸测量

实验8HALCON三维测量,3D重建测量

 

实验1HALCON概述,应用范例

实验2HDevelop介绍,操作编程范例

1邮票分割

文件名:

stamps.dev

 

第一个例子进行文件分析任务。

图5.1展示了部分邮票目录页。

它描述了两种不同的邮票:

以图形描述为主和以文字描述为主。

为了使用这个例子,必须把文字描述转化为计算机所能理解的形式。

你可能使用OCR编程方式,你很快发现由于邮票的图形描述会导致大多数的可使用模块产生错误。

于是另一项任务必须要进行预处理:

对所有的邮票进行转化(例如,把邮票转化为灰色有价值的纸),这样就可以使用OCR

处理邮票的剩余部分了。

当创造一个应用程序来解决这种问题,对要处理的对象进行特征提取是非常有帮助的。

这个任务可以为新手提供解决的这类问题一些的经验。

●一般而言,特征提取有如下步骤:

邮票比纸要黑。

●邮票包含图像的部分不重叠。

●邮票具有最大最小尺寸。

●邮票是长方形的。

图5.1:

Michel图表的部分页.

如果直接使用属性清单而非编程,任务会变得很简单。

可惜由于语言的含糊,这是不可能的。

所以你需要建构具有精确的语法和语义的语言,尽可能接近非正式的描述。

使用HDevelop语法,一个通常的程序看起来如下:

dev_close_window()

read_image(Catalog,’swiss1.tiff’)

get_image_pointer1(Catalog,Pointer,Type,Width,Height)

dev_open_window(0,0,Width/2,Height/2,’black’,WindowID)

dev_set_part(0,0,Height-1,Width-1)dev_set_draw(’fill’)

threshold(Catalog,Dark,0,110)dev_set_colored(6)

connection(Dark,ConnectedRegions)fill_up(ConnectedRegions,RegionFillUp)select_shape(RegionFillUp,StampCandidates,’area’,

’and’,10000,200000)select_shape(StampCandidates,Stamps,’compactness’,’and’,1,1.5)

smallest_rectangle1(Stamps,Row1,Column1,Row2,Column2)

dev_display(Catalog)

dev_set_draw(’margin’)

dev_set_line_width(3)

disp_rectangle1(WindowID,Row1,Column1,Row2,Column2)

由于一些为止的操作符合不熟悉的语法,这个程序咋看起来会很晦涩。

但如果仔细看一下这个操作符,你就会注意以下说明的直接联系。

threshold选择全部图像像素黑暗比值。

connection合并所有选定像素触摸相互连通区。

selectshape选择区域面积(属性:

'面积')在指定区间内。

smallestrectangle1计算每个区域的坐标(连续/栏)的包围矩形。

一旦用户熟悉了承操作符和语法、转换就变得很容易。

特别需要指出,对于程序来说,图像或者加工区是否被处理并不重要,你可以使用相同的方法处理他们。

.由于中间数据结构的内存管理对用户来说是透明的,你可以不必理会它,你可以集中解决图像分析任务。

图5.2邮票分割处理的结果

2毛细血管

文件名:

vessel.dev

这个例子的任务是分割毛细血管。

尤其,你要把图5.3(图像左)的细胞区域的上、下部分从图像的中央区域区分开。

区界线很模糊,甚至以人的来认识他们都是困难的。

乍看之下,似乎很难找到一个分割准则:

在这两幅图的灰度值既无明显清晰的边界也无明显的不同。

所以用限定操作或边界操作并不是很有用。

解决这一问题的一个方法是利用区域的不同质地:

细胞比有血液供应得部分的更有角质化。

强调这种差异,你可以用纹理变换。

变换是线性纹理过滤加大对某些频率所要求的典型纹理。

HALCON的相应操作叫做纹理法则。

你必须指明大小和过滤式。

双方属性确定的频率

的性能。

在这个程序里过滤器”el”使用5×5的大小。

在垂直方向和水平方向,它表现了一个平滑推导。

因此在垂直方向是加大结构。

你不可以直接使用计算机的处理结果(图5.3右),因为他有太多的斑点。

因此,你可以通过一个主要的过滤器产生纹理图像。

通过这你可以的得到所谓的纹理能量(图5.4左)。

 

图5.4:

毛细血管纹理能源(左)和分割(右)。

选择的过滤面罩在这个计划是非常大的。

面具大小在水平方向和垂直方向为211和61。

采用不对称方式,因为在水平方向上血管是堵塞的。

因此你得到一个图像上下部分比中间部分明亮。

read_image(Image,’vessel’)

texture_laws(Image,Texture,’el’,5,5)mean_image(Texture,Energy,211,61)bin_threshold(Energy,Vessel)

区分这些区域你只要找到合适的门槛。

在这种情况下,我们有两种不同的纹理—门限可以自动发现。

这是有操作符binthreshold完成的,这也同样门限的结果和这样的血管。

图5.4(右)显示了分割的结果。

3颗粒

文件名:

particle.dev

这个程序示例处理的图像是来自于一个医学程序的处理结果。

它显示载体上的微小颗粒(图5.5左)。

 

图5.5:

微小颗粒(左)大的物体(右)。

正如其他许多医学应用,目前已存在的对象必须进行评估统计。

这意味着将有不同的对象按大小或其它属性提取和分类,这样你可以分析他们。

为解决这一问题迈出的重要一步,是相关物件的图像分割。

统计评价为您不妨看看合适的文献统计。

在我们的例子有两个类型的对象:

---大的,明亮的颗粒

---小的,暗的颗粒

大的,明亮的颗粒由于它们的灰度值不同于它们的背景。

比背景明亮意味着要使用门限方式处理。

你唯一要决定的是指定门限是自动还是使用经验值。

在我们的例子里,一个固定的门限值由于好的对比是非常重要的。

因此,你要有一个好的计算方法:

read_image(Particle,’particle’)threshold(Particle,Large,110,255)

变量其包含所有像素灰度值超过110。

你可以从图5.5右边的图看到。

发现小的,暗的颗粒是很困难的。

指出门限的第一步努力说明没有固定的门限使用与所有的颗粒。

但是如果更仔细的观察你就会发现小的颗粒比它们周围的环境明亮,例如,你可以指定一个合时的门限值对小图像的部分区域是合适的。

现在,把这个发现转化为算法是容易的,一种决定门限的值的本地方法。

另一个可能的解决当地环境的定义由n阶窗口,这种方法在本例中使用。

窗外的平均值作为一个近似的背景强度。

这可以通过选择低通滤波,要么是平均要么是高斯滤波器过滤。

窗口尺寸大小决定于当地的环境,并应约两倍之多对象搜寻。

这样显示平均直径15像素,用口罩面积31。

由此所指定的象素比较原始灰度值的平均数。

减少噪音引起的问题加上一个常量(3)。

适当程序段看起来如下:

mean_image(Particle,Mean,31,31)

dyn_threshold(Particle,Mean,Small,3,’light’)

dynthreshold操作符比较两个像素的图像像素。

可以看到图5.6(左)分割结果。

我们看到,所有的物体被发现.可惜,边缘的大型粒子和一些非常小的区域,由于噪音的出现也混合在一起出现。

我们一开始尝试压缩边界。

这样做的会产生一个超过允许最大值的常数。

你可以这样做:

connection(Small,SmallSingle)

select_shape(SmallSingle,ReallySmall,’area’,’and’,1,300)

采用这种方法你也有可能清除掉一些非常小的物体。

你只需要使用selectshape增调用增加最小尺寸。

但是如果你再次检查分割结果,你会发现一些已经造成像素提取第一分割。

因此你应该寻找小颗粒以弥补大的不足。

为了避免分割大颗粒附近的小颗粒,这些都是建立在互补放大。

因此,我们如下修改的程序。

dilation_circle(Large,LargeDilation,8.5)

complement(LargeDilation,NotLarge)

reduce_domain(Particle,NotLarge,ParticleRed)mean_image(ParticleRed,Mean,31,31)

dyn_threshold(ParticleRed,Mean,Small,3,’light’)

图5.6简单物体(左)和高级分割(右)

这种方法显示出两个优点:

图5.6小物体:

简单(左)和已经分割的(右)

dilation_circle(Large,LargeDilation,8.5)

complement(LargeDilation,NotLarge)

reduce_domain(Particle,NotLarge,ParticleRed)mean_image(ParticleRed,Mean,31,31)

dyn_threshold(ParticleRed,Mean,Small,3,’light’)

这种方式有两种优势:

第一,大颗粒的模型可以被用来提取小的颗粒。

这增加了分割的质量;第二,分割的进程被加速,因为分割的第二部分工作建立在部分图像之上。

图5.6的右边图像显示了分割结果。

可惜,图像仍然还有噪音。

为了去掉它们,你要么使用以前说过的使用面积来去除,要么使用opening操作符,我们推荐使用第二种方法,因为它能平滑图像的边界。

opening_circle(Small,SmallClean,2.5)

这里opening操作符使用循环结构,这个操作符所保存的区域最小是一个直径为2.5的区域。

更小的区域杯清除了。

图5.7左边的图显示了带有噪音的分割结果。

右边的显示的是最终的结果。

最终,我们将要展示怎样使用直接鼠标来选择区域的例子。

在这里,有一个循环检测一直在执行,直到你按下鼠标的左键或者右键,操作符getmbutton返回你按下的键以及你按键的位置。

这些信息被用来选择对象在接下来的相应得程序部分。

图5.7噪音去除分割(左)和最终结果(右)

dev_clear_window(WindowID)

connection(SmallClean,SmallSingle)

Button:

=1

dev_set_color(’red’)

while(Button=1)

get_mbutton(WindowID,Row,Column,Button)

select_region_point(SmallSingle,OneObject,Row,Column)

首先,窗口通过devclearwindow被清除,接着connection计算所有相连的部件来允许选择单个区域。

在HDevelop窗口也显示了区域部件。

在这里你可以使用红色来标记所选择的区域,通过给变量button赋值1,查询鼠标的状态,选择被选区域来初始化循环。

作为示例平均灰度和标准分割都已被计算好了。

你只需按下鼠标左键启动循环,按下任何鼠标键可以停止操作。

4年轮

文件名:

wood.dev

所有人都知道通过计算树木的年轮来计算它们的年龄。

这个示例程序也是这样做的。

第一步是分割年轮,这很容易,因为你可以清楚地分清明暗线。

接着使用动态门限(dynthreshold),你使用带有15x15的平均滤波来达到一个合适门限图像。

这个分割图像含有非常小的区域没有年轮。

为了去掉它们你使用connection来创建连接部件,selectshape压缩所有太小的区域。

计算年轮变得很困难,因为在图像中表现为柱状(图5.8)。

图5.8树的年轮

这样我们建议使用如下方法:

你使用鼠标来确定线的开始点和结束点。

这样年轮的交叉点可以计算出来。

这可以通过如下HALCON操作:

开始与结束点可以被它们的x-和y-坐标来标记,使用genregionline来转化为线段,使用intersection来分割年轮。

连接的区域就是年轮。

完整的程序如下:

dev_close_window()

read_image(WoodPiece1,’woodring’)

get_image_pointer1(WoodPiece1,Pointer,Type,Width,Height)

dev_open_window(0,0,Width/2,Height/2,’black’,WindowID)mean_image(WoodPiece1,ImageMean,9,9)dyn_threshold(WoodPiece1,ImageMean,Regions,5.0,’dark’)threshold(WoodPiece1,Dark,0,90)

dilation_rectangle1(Dark,DarkDilation,30,7)difference(Regions,DarkDilation,RegionBright)connection(RegionBright,ConnectedRegions)select_shape(ConnectedRegions,SelectedRegions,

’area’,’and’,30,10000000)

get_mbutton(WindowID,Row1,Column1,Button1)get_mbutton(WindowID,Row2,Column2,Button2)gen_region_line(Line,Row1,Column1,Row2,Column2)intersection(Line,SelectedRegions,Inters)connection(Inters,ConnectedInters)

Number:

=|ConnectedInters|

5焊接

文件名:

ball.dev

这是第一个涉及质量检测的例子。

这个例子用来检测焊点。

图5.9展示了两种典型的虚焊。

图5.9虚焊图形

虚焊的边界和连接线看起来是暗的。

这样你可以使用门限。

因为背景也是黑的,我们要先提取虚焊在作分割之前。

虚焊是明亮的,我们可以通过灰度来选择它们的像素。

read_image(Bond,’die3’)

threshold(Bond,Bright,120,255)shape_trans(Bright,Die,’rectangle2’)

虚焊的像素由于使用门限失去的可以通过赫尔计算恢复。

由于虚焊是矩形的,可能有些轻微的变动在收集的过程中,我们可以使用最小的长方形作为赫尔。

现在你可以开始分割焊点的线和连接点。

因为只有这部分区域是我们感兴趣,你可以将分割只限定在这部分区域。

所有的像素低的区域是属于连接线。

不幸的是还有一些像素高的区域是分割没有发现的。

你可以使用fillupshape来填充哪些区域。

在这种情况下,这个区域使用某种大小得象素值填充。

reduce_domain(Bond,Die,DieGray)threshold(DieGray,Wires,0,100)

fill_up_shape(Wires,WiresFilled,’area’,1,100)

opening_circle(WiresFilled,Balls,15.5)connection(Balls,SingleBalls)

select_shape(SingleBalls,IntermediateBalls,’circularity’,and,0.85,1.0)sort_region(IntermediateBalls,FinalBalls,’FirstPoint’,’True’,’column’)smallest_circle(FinalBalls,Row,Column,Radius)

因为连接点比连接线要厚,你可以简单使用opening来清除它们。

直径(15.5)应该是对应连接点的直径最小值。

在这两幅图你都可以看到有灰色长方形区域所产生的区域。

这可以通过一个shape分割来压缩它。

在实际情况中,一个被探测的焊点总是出现它应该出现的地方。

图5.10显示了整个分割的过程。

图5.10探测的焊点位置

连接点显示使用白色区域,每个连接点的半径都已紫色的变量显示。

你可以通过计算半径的数量来获得连接点的数量。

NumBalls:

=|Radius|Diameter:

=2*Radius

MeanDiameter:

=sum(Diameter)/NumBalls

MinDiameter:

=min(Diameter)

6刻度盘

文件名:

calib.dev

这是第一个关于刻度盘的例子,它用力指定一个CCD摄像头的内部参数。

因此你要提取图中的圆圈。

见图5.11的左边图。

 

图5.11刻度盘和grayinside结果

这个例子介绍了一个很有意思的操作,它叫做grayinside或者fuzzy操作。

在这种情况下,fuzzy意味着每个点的像素值不是一个确定的灰度值而是归属一个特定类。

数值越大,越强。

通过对图像应用grayinside,每个像素值都被解释为潜在能量你必须提供给图像边缘的,它可以通过的像素的位置得到。

低像素代表谷而高的表示峰。

像这样一个图像中的灰色区域相当于山上的洞,需要很多能量。

这同样适用于明亮背景的灰色圆圈。

在使用grayinside之前,你应该使用平滑滤波器提取小的数值。

这在很大程度上减少了运行时间。

如果你观察一下图5.11右边图的操作结果,你就会注意圆圈作为有意义的明亮的点。

现在一个简单的门限来提取它们是至关重要的。

read_image(Caltab,’caltab’)gauss_image(Caltab,ImageGauss,9)gray_inside(ImageGauss,ImageDist)threshold(ImageDist,Bright,110,255)connection(Bright,Circles)

elliptic_axis(Circles,Ra,Rb,Phi)

在计算(ellipticaxis)每个圆的椭圆参数之后,你可以计算摄像头的参数。

7设备

这个例子讨论使用不同的分割方法的结合。

它的操作对象是具有多个电子元件的图像,它们在外形,大小以及排列上都不相同。

图5.12的左边图显示了输入图像。

图5.12带有电子原件的电路板(左)和在HSV空间的相应得灰度值(右)

首先,你要提取电阻与电容。

这相当容易,因为彩色图像中它的元件具有不同的颜色。

输入图像具有三种颜色通道,包括红,绿和蓝。

因为在RGB空间中进行分割是相对困难得的,你需要将图像转化到HSV空间。

在这里颜色信息储存在单一的信道。

图5.12的右边图显示图像在单一信道的代替物。

太小的元件可以通过selectshape来清除。

程序显示如下:

read_image(ICs,’ic’)

decompose3(ICs,Red,Green,Blue)

trans_from_rgb(Red,Green,Blue,Hue,Saturation,Intensity)threshold(Saturation,Colored,100,255)

reduce_domain(Hue,Colored,HueColored)

threshold(HueColored,Blue,114,137)

connection(Blue,BlueConnect)

select_shape(BlueConnect,BlueLarge,’area’,’and’,150,100000)shape_trans(BlueLarge,Condensators,’rectangle2’)

threshold(HueColored,Red,10,19)

connection(Red,RedConnect)

select_shape(RedConnect,RedLarge,’area’,’and’,150,100000)shape_trans(RedLarge,Resistors,’rectangle2’)

如果你更仔细的观察一下程序,你就会结果有了显著的提高。

其中之一是因为颜色模型,彩色图形的门限在所有的像素间选择一个固定的颜色,选择在颜色浸透部分时独立的。

这有可能造成非常亮或者非常暗的像素与电子元件有相同的灰度。

,但你只寻找非常强烈的颜色。

所以你选择的像素点都是色彩强烈的点,例如具有色才饱和度的像素点。

第二个加强的是对象的形状,因为所有的元件都是矩形的,你可以指定所有相连的元件最小的矩形来加强分割效果。

图5.13的左边图是结果元件的标注。

图5.13电阻和电容(左)和ic元件(右)

第二步我们寻找所有的ic元件。

这看起来很容易,因为它相当的大而且暗,但是由于明亮的标记被打印在IC元件的周围会出现一些问题。

所以一个简单的门限处理并不是有效的。

除此之外你还有联合所有属于一个IC元件的片断,这可以通过检查片断的连接部位。

可以使用膨胀来扩展区域直道它们相互交替,但又不能太大以致IC元件都重叠。

标记之间的空白一定要比IC元件之间的小。

现在你可以分离IC元件从它们的相连的元件中。

可惜它们太大以致不能分割。

另一个对相连的元件的门限将会探测每个IC元件的暗的像素。

最终你可以用闭合的矩形里指定电阻和电容。

threshold(Intensity,Dark,0,50)

dilation_rectangle1(Dark,DarkDilate,15,15)connection(DarkDilate,ICLarge)

add_channels(ICLarge,Intensity,ICLargeGray)threshold(ICLargeGray,ICsDark,0,50)shape_trans(ICsDark,IC,’rectangle2’)

图5

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 临时分类 > 批量上传

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2