机器视觉实验指导书.doc_第1页
机器视觉实验指导书.doc_第2页
机器视觉实验指导书.doc_第3页
机器视觉实验指导书.doc_第4页
机器视觉实验指导书.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

机器视觉实验指导书 机器视觉软件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)fi ll_up(ConnectedRegions,RegionFillUp)(RegionFillUp,StampCandidates,area,and,10000,select_shape(StampCandidates,Stamps,pactness,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)select_shape200000)由于一些为止的操作符合不熟悉的语法,这个程序咋看起来会很晦涩。 但如果仔细看一下这个操作符,你就会注意以下说明的直接联系。 threshold选择全部图像像素黑暗比值。 connection合并所有选定像素触摸相互连通区。 selectshape选择区域面积(属性:面积)在指定区间内。 smallestrectangle1计算每个区域的坐标(连续/栏)的包围矩形。 一旦用户熟悉了承操作符和语法、转换就变得很容易。 特别需要指出,对于程序来说,图像或者加工区是否被处理并不重要,你可以使用相同的方法处理他们。 .由于中间数据结构的内存管理对用户来说是透明的,你可以不必理会它,你可以集中解决图像分析任务。 图5.2邮票分割处理的结果2毛细血管文件名:vessel.dev这个例子的任务是分割毛细血管。 尤其,你要把图5.3(图像左)的细胞区域的上、下部分从图像的中央区域区分开。 区界线很模糊,甚至以人的来认识他们都是困难的。 乍看之下,似乎很难找到一个分割准则:在这两幅图的灰度值既无明显清晰的边界也无明显的不同。 所以用限定操作或边界操作并不是很有用。 解决这一问题的一个方法是利用区域的不同质地细胞比有血液供应得部分的更有角质化。 强调这种差异,你可以用纹理变换。 变换是线性纹理过滤加大对某些频率所要求的典型纹理。 HALCON的相应操作叫做纹理法则。 你必须指明大小和过滤式。 双方属性确定的频率的性能。 在这个程序里过滤器”el”使用55的大小。 在垂直方向和水平方向,它表现了一个平滑推导。 因此在垂直方向是加大结构。 你不可以直接使用计算机的处理结果(图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颗粒文件名:parti cle.dev这个程序示例处理的图像是于一个医学程序的处理结果。 它显示载体上的微小颗粒(图5.5左)。 图5.5:微小颗粒(左)大的物体(右)。 正如其他许多医学应用,目前已存在的对象必须进行评估统计。 这意味着将有不同的对象按大小或其它属性提取和分类,这样你可以分析他们。 为解决这一问题迈出的重要一步,是相关物件的图像分割。 统计评价为您不妨看看合适的文献统计。 在我们的例子有两个类型的对象-大的,明亮的颗粒-小的,暗的颗粒大的,明亮的颗粒由于它们的灰度值不同于它们的背景。 比背景明亮意味着要使用门限方式处理。 你唯一要决定的是指定门限是自动还是使用经验值。 在我们的例子里,一个固定的门限值由于好的对比是非常重要的。 因此,你要有一个好的计算方法:read_image threshold(Particle,Large,110,255)(Particle,particle)变量其包含所有像素灰度值超过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)plement(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)plement(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左边的图显示了带有噪音的分割结果。 右边的显示的是最终的结果。 最终,我们将要展示怎样使用直接鼠标来选择区域的例子。 在这里,有一个循环检测一直在执行,直到你按下鼠标的左键或者右键,操作符get mbutton返回你按下的键以及你按键的位置。 这些信息被用来选择对象在接下来的相应得程序部分。 图5.7噪音去除分割(左)和最终结果(右)dev_clear_window(WindowID)connection(SmallClean,SmallSingle)Button:=1dev_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 gauss_image(Caltab,ImageGauss,9)gray_inside(ImageGauss,ImageDist)threshold(ImageDist,Bright,110,255)connection(Bright,Circles)(Caltab,caltab)elliptic_axis(Circles,Ra,Rb,Phi)在计算(ellipticaxis)每个圆的椭圆参数之后,你可以计算摄像头的参数。 7设备这个例子讨论使用不同的分割方法的结合。 它的操作对象是具有多个电子元件的图像,它们在外形,大小以及排列上都不相同。 图5.12的左边图显示了输入图像。 图5.12带有电子原件的电路板(左)和在HSV空间的相应得灰度值(右)首先,你要提取电阻与电容。 这相当容易,因为彩色图像中它的元件具有不同的颜色。 输入图像具有三种颜色通道,包括红,绿和蓝。 因为在RGB空间中进行分割是相对困难得的,你需要将图像转化到HSV空间。 在这里颜色信息储存在单一的信道。 图5.12的右边图显示图像在单一信道的代替物。 太小的元件可以通过selectshape来清除。 程序显示如下read_image(ICs,ic)depose3(ICs,Red,Green,Blue)trans_f rom_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.13的右边图显示了IC的结果图。 关于上面的程序我们要提及两点。 这里操作符addchannels被reducedomain代替。 这是必须的因为一些区域必须用灰色像素值来填充。 前面程序的处理是相当不同的,一幅图有效的像素点四有限的。 这就有了第二点,操作符threshold有一些图片作为输入,门限处理每幅图都有,因此,你提供的尽可能多的区域作为输入图像。 最终IC的分割必需进行,它们明亮且非常小。 使用动态门限处理它们是相当容易的。 然而电路板上的锡元件依然是一个问题,它们必须从IC中提取出来。 这可以通过限定在特定的区域寻找。 IC接触可能只出现在IC的元件的左边或者右边。 感兴趣的区域的界定可以通过扩大IC区域,可以通过另一种膨胀来实现结果。 图5.14左边图显示了操作结果。 图5.14寻找相关区域(左)和IC相关区域(右)现在你只需要对感兴趣的区域使用门限处理即可。 dilation_rectangle1(IC,ICWidth,5,1)difference(ICWidth,IC,SearchingArea)dilation_rectangle1(SearchingArea,SearchingAreaWidth,14,1)union1(SearchingAreaWidth,SearchingAreaUnion)reduce_domain(Intensity,SearchingAreaUnion,SearchGray)mean_image(SearchGray,Mean,15,15)dyn_threshold(SearchGray,Mean,Contacts,5,light)connection(Contacts,ContactsConnect)fi ll_up(ContactsConnect,ContactsFilled)select_shape(ContactsFilled,ContactsRes,area,and,10,100)交叉点的结果实令人满意的,一些太小或者有错的区域已经被发现,所以我们使用selectshape来去除它们。 图5.14的右边图显示了处理最终结果。 8细胞壁在这个例子中我们观察在树的成长中细胞壁的分裂的选择。 输入图像是木头细胞的显微镜下观察的图像(见图5.15)。 你可以清楚地看到单个细胞和由于冬季造成的细胞的成长不连续性。 提取细胞壁是很简单的,因为它们相当的暗。 主要的困难在于计算生长方向的分配,例如沿着图像的X轴。 第一,我们限定窗口的厚度,细胞分布的计算通过X变量进行负值完成。 接着我们使用getimagepoint1来获得图像的大小以便得到相应得循环参数。 搜寻的范围越宽,测量时的滤波效果越好。 现在循环从左边开始来计算真个图像。 细胞壁面积的比率和矩形的宽对每一此循环都要计算一次。 细胞壁的像素值决定于areaenter。 这个数值转化为百分比输出。 X:=20read_image(WoodCells1,woodcell)threshold(WoodCells1,CellBorder,0,120)get_image_pointer1(WoodCells1,Pointer,Type,Width,Height)open_file(wood_cells.dat,output,FileHandle)for i:=0to Width-X-1by1clip_region(CellBorder,Part,0,i,Height-1,i+X)area_center(Part,Area,Row,Col)fwrite_string(FileHandle,i+(Area*100.0/(X*Height)fnew_line(FileHandle)endfor close_file(FileHandle)图5.16显示测量结果。 图5.16显微镜下的树木细胞为了以后能处理这些数据,它必须写进文件。 因此,使用openfile打开一个txt文件,你可以使用fwritestring和fnewline对文件进行写操作。 文件输出的格式有fwritestring确定。 文件输出以循环变量开始然后是空格。 因此数值转化为字符。 最终,细胞壁的比例与这个字符关联。 在这里第一个或者第二个数值是字符串的形式表达是至关重要的,所以接下来的数值也转化为字符串。 这里+表示字符串的加法运算。 图5.16以百分比的形式表现的细胞壁成长中的比例9区域选择这个例子讲述怎样处理单个图标对象。 相对于有很多不同的函数可以被执行的数值数据,图标数据可以只可以被HALCON操作符处理,这个在选择和联合图标数据是最重要的操作符在例子显示。 图5.17大狒狒和探测结果这是一个单一的任务。 我们通过门限检测明亮的部分。 因此,我们不得不根据外形和大小来选择眼睛的相关部分。 在这里你可能使用操作符selectshape和使用5条线的程序来处理任务。 为了表述的目的,我们一种低水平的版本代替每个区域都单独提取和检查。 如果符合给定的图形,就向结果变量作加法运算。 dev_close_window()read_image(Image,monkey)threshold(Image,Region,128,255)connection(Region,ConnectedRegions)select_shape(ConnectedRegions,CompactRegions,pactness,and,1.5,1.8)Number:=|CompactRegions|Eyes:=for i:=1to Numberby1SingleSelected:=CompactRegionsiarea_center(SingleSelected,Area,Row,Column)dev_set_color(green)i f(Area500)and(Area=128;/select allbright pixels HRegionArray Conn=Bright.Connection();/get connectedponents/select regionswith asize ofat least500pixelsHRegionArrayLarge=Conn.SelectShape(area,and,500,90000);/select theeyes outof theinstance variableLarge by using/the anisometryas regionfeature:HRegionArray Eyes=Large.SelectShape(anisometry,and,1,1.7);Eyes.Display(w);/display resultimageinwindoww.Click();/wait formouse click图3.2:这是选取眼睛的程序.5.1.1.1区域数组类HRegionArray作为区域的容器类。 另外,通过HRegionArray调用那些操作(请看4.2.2节),HRegionArray提供以下成员函数图5.1类HRegion应用的简单程序图5.2左图是输入图象(mreut.png),右图是打开后的区域(open)。 使用reg的联合,取实际矩阵的每一区域的微分,请看参考手册条目difference。 大多数HALCON操作需要一个区域,因为输入参数允许HRegionArray的实例,例如,Union1,Intersection,Difference,等。 从单一区域HRegion,构造器示例区域数组HRegionArray使之可以处理单一区域的操作不需要改变数据结构,HRegionArray就可以作为输入参数,甚至是在单一区域的情况下。 图5.3给出了怎样使用类HRegionArray的例子图5.3使用类HRegionArray的简单例子第一步读取一幅图象。 在这个例子中给出了在制造业环境中的控制单元,看图5.4的左边。 通过应用HALCON库的区域生长算法,图象被分割为区域。 在结果区域数组中,每一个区域根据大小和紧密度被选取。 每一个大小超过1000象素并且紧密度小于1.5的区域被添加到区域数组rect。 在for循环处理之后,只有图5.4右图的区域被留下来。 图5.4左边是输入图象(fabrik.png),右边是被选取的矩形。 5.1.2图象HALCON图象不仅仅是矩阵象素在HALCON中,矩阵被称作通道,图象可能有一个或多个通道构成。 例如,黑白图象有单个通道构成,在彩色图象中有三个通道。 通道不仅可以包含标准的8位的象素表示灰度值的图象,HALCON允许允许其它数据,例如16位的整数或者是32位的浮点数。 除了象素信息,每一个HALCON图象还存贮了所谓的范围,以HALCON区域的形式。 范围可以解释为一个区域的影响,也就是HALCON限制对这个区域的操作。 5.1.2.2图象对象类HImage是所有图象类的父类,通过使用类HImage,所有不同的象素类型可以以唯一的方式(多态性)被处理。 类HImage不是虚的,所以可以被示例。 另外,那些操作可以通过HRegion被调用,HRegio

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论