Halcon基础部分

        本手册向您介绍了重要的机器视觉方法。要指导您从特定的应用程序到要阅读的文档的各个部分,本节列出了公共应用程序区域和用于它们的方法。通常,许多应用程序使用以下方法:第23页上的图像采集,以便通过图像采集设备或通过文件访问图像。•在253页上的•可视化,例如,人工创建的图像或图像处理任务的结果。•第27页感兴趣的区域,用于减少以下图像处理任务的搜索空间。•形态学(参考手册,“形态学”一章),例如,用于消除灰色值图像中区域或结构中的小间隙或突起。其他方法更具体,因此适用于特定的应用领域。此外,一些应用程序区域是另一个应用程序区域的一部分。为了使关系更加明显,对于以下应用领域,列出了相应的方法和相关的应用领域:

颜色检查(第16页)        完整性检查(第16页)        识别(第16页)

测量2D比较(16页)        测量和比较3D(17页)        物体识别2D(17页)

物体识别3D(17页)        位置识别2D        位置识别3D18页        3D(18页)        

打印检查(18页)        质量检查(19页)        机器人视觉(第19页)        安全系统(第19页)

表面检查(第19页)        纹理检查(第20页)

为了加快一些应用程序,可以使用计算设备。何时以及如何使用计算设备在第263页解释计算设备。

一、图像采集

        用HALCON获取图像基本上包括三个步骤。从文件中读取图像更简单。

 打开图像采集设备        获取图像        关闭图像采集设备

打开图像采集设备:调用open_framegrabber,并指定相应的图像采集接口的名称。

获取图像 :连接到设备后,您只需调用grab_image即可获取图像。若要从磁盘上加载映像,请使用read_image。系统将在当前目录和环境变量半映像中指定的目录中搜索图像。

关闭图像采集设备:在应用程序结束时,您将关闭到图像采集设备的连接,调用close_framegrabber函数释放其资源。

如前所述,从文件中获取图像对应于一个函数调用:

read_image (Image, 'particle')

以下代码将处理从图像序列文件中读取的图像:

SequenceName := 'pendulum/pendulum.seq'
open_framegrabber ('File', -1, -1, -1, -1, -1, -1, 'default', -1, 'default', \
-1, 'default', SequenceName, 'default', -1, -1, \
AcqHandle)
while (ImageNum <= MaxImageNum)
grab_image (Image, AcqHandle)
... process image ...
ImageNum := ImageNum + 1
endwhile

        在实际应用中,通常告诉相机获取图像是不够的;相反,以正确的时刻或速度获取图像,并适当地配置相机和图像获取接口可能是很重要的。因此,HALCON允许进一步参数化采集过程。在H开发中,通过菜单项助手>图像获取提供了一个助手,帮助您选择图像源、调整参数和生成合适的代码。

        当使用open_framegrabber连接到图像采集设备时,主要参数是对应的HALCON图像采集接口的名称。因此,您可以获得一个所谓的句柄,稍后您可以使用它访问设备,例如,使用grab_image或grab_image_async获取图像。

(大小、分辨率、像素类型、颜色空间)。对于大多数这些参数,如果指定值“默认”(字符串参数)或-1(参数值),则会使用默认值。使用函数info_framegrabber,您可以查询界面的版本号或可用板、端口号和相机类型等信息。关于open_framegrabber参数的详细信息可在解决方案指南II-A中找到(配置连接:第11页的第3节;配置获取的图像:第17页的第4节)。 

        如上所述,您在使用open_framegrabber连接到图像采集设备时就已经设置了参数。这些参数(image_acquisition设备/相机的配置和图像大小等)。是所谓的一般参数,因为它们是几乎所有的图像采集接口都共有的。然而,图像采集设备在所提供的功能上差异很大,导致了许多更特殊的参数。这些参数可以使用操作员set_framegrabber_param进行自定义。使用操作符get_framegrabber_param,您可以查询公共参数和特殊参数的当前值。关于设置参数的详细信息可以在第17页第4节的解决方案指南II-A中找到。

        实际上,在一个典型的机器视觉应用程序中,您不会使用操作员grab_image来获取图像,而是使用grab_image_async。这两个操作符之间的区别是:如果您通过循环获取和处理图像,grab_image总是请求获取一个新的图像,然后阻止程序,直到采集完成。然后,图像被处理,然后,程序等待下一个图像。相比之下,当使用grab_image_async时,图像被并行获取和处理:在处理图像时,已经被获取了下一个图像。当然,这导致了应用程序的显著加速。

二、感兴趣区域

        利用roi可以分为两个简单的部分:创建区域并将它们与图像组合起来。HALCON提供了许多创建区域的方法,然后可以将其用作roi。传统的方法是生成标准形状,如圆、椭圆、矩形或多边形。此外,区域可以通过从XLD等其他数据类型中转换它们、通过分割图像或通过用户交互来导出。

        通过将一个区域与一个图像结合起来,该区域承担了一个ROI的作用,即,它定义了必须处理图像的哪一部分。在HALCON中,ROI也被称为图像的域。这个术语来自于数学,其中一个图像可以被视为一个将坐标映射到灰度值的函数。ROI将该函数的域从完整的图像简化到相关的部分。因此,将区域和图像组合起来的操作符称为reduce_domain。这个简单的操作符在几乎所有的应用程序中都满足了所期望的任务

        作为基本概念的一个示例,下面的程序显示了利用ROI的所有重要步骤。该图像将从文件中获取。在图像中,只应该处理中心周围的一个圆形部分。为了实现这一点,使用gen_circle生成一个圆形区域。该区域使用reduce_domain与图像结合起来。这样的效果是在调用操作符时只处理ROI的像素。例如,如果将操作符edges_sub_pix应用于该图像,则仅在圆圈内提取子像素精确的轮廓。为了使其可见,我们在示例程序的末尾添加了一些可视化操作符。\

read_image (Image, 'mreut')
gen_circle (ROI, 256, 256, 200)
reduce_domain (Image, ROI, ImageReduced)
edges_sub_pix (ImageReduced, Edges, 'lanser2', 0.5, 20, 40)
dev_display (Image)
dev_display (ROI)
dev_display (Edges)

分段图像:HALCON非常典型的方法是通过分割步骤创建roi。使用图像处理方法提取与进一步处理相关的图像部分,并从图像中提取,而不是具有预定义的ROI。这种方法是可能的,因为roi只是普通的HALCON区域,因此共享它们的所有优点,如高效处理和任意形状(参见章节中的快速指南??在页面上??以获取有关HALCON区域的更多信息)。用于roi的区域分割采用与标准印迹分析相同的方法。有关更多详情,请参考第36页对本步骤的描述。

绘制区域:指定roi的标准方法是使用鼠标交互式地绘制形状。为了做到这一点,HALCON为标准形状和自由形状提供了特殊的操作符。这类操作的所有操作符都以前缀draw_开头。使用鼠标左键(绘制、挑选和拖动)执行图形,然后单击鼠标右键完成。

创建区域:标准的方法是根据用户交互或文件中存储的坐标值返回的坐标和维度来生成区域。在这种情况下,将使用诸如gen_circle、gen_rectangle2或gen_region_polygon_filled等操作符。更高级的是用于指导预处理步骤以节省执行时间的特殊形状。典型的例子是线或点或格子板的网格。使用这些形状,图像可以以系统的方式覆盖,并检查特定对象的发生。如果您想要分割,例如,给定最小大小的斑点,那么在第一步中使用比最小对象大小更好的搜索网格就足够了。在第二步中,这些片段被扩展(dilation_rectangle1),分割方法再次被调用,现在在这个放大的区域内。如果对象只覆盖图像中相对较小的区域,这种方法可以显著加快处理过程。

工艺区域:有时,一个给定的ROI的形状,无论是由程序生成的还是由用户定义的,都不满足要求。在这里,HALCON提供了许多操作符来修改形状以相应地调整它。通常使用的操作符是,例如,fill_up来填充区域内的孔,shape_trans来应用一般的变换,如凸包或最小的矩形,或形态学操作符,如erosion_circle,使区域更小,或closing_circle来填充空白。有关更多详情,请参考第38页对本步骤的描述。

对齐roi或图像:有时,一个ROI的坐标取决于图像中另一个对象的位置。如果对象正在移动,则ROI必须相应地移动(对齐)。这是通过首先使用模板匹配来定位对象来实现的。根据确定的位置和方向,对roi的坐标进行变换。如何使用基于形状的匹配进行对齐在第34页第2.4.3.2节的解决方案指南II-B中都有描述。

Create ROI :此步骤将该区域和该图像结合起来,以利用该区域作为该图像的域。建议使用的标准方法是reduce_domain。它具有安全和语义简单的优点。rectangle1_domain是生成矩形roi的快捷方式(而不是按顺序调用gen_rectangle1和reduce_domain)。对于高级应用程序,change_domain可以作为比reduce_domain稍快的版本使用。该操作员不执行与现有域的交叉,也不检查区域是否在图像之外——如果区域部分位于图像之外,当将操作员应用到数据时,这将导致系统崩溃。如果程序员确保输入区域定义得很好,那么这是一种节省(一点)执行时间的方法。
可视化结果:最后,您可能希望显示roi或简化的图像。使用操作员get_domain,图像当前使用的区域可以像任何其他区域一样被访问和显示(和处理)。当显示一个图像时,例如,使用disp_image时,只显示已定义的像素。图像域之外的图形窗口中的像素将不会被修改。有关详细信息,请参见第253页对此方法的描述.

三、Blob分析

        在图像中,相关对象的像素(也称为前景)可以通过它们的灰色值来识别。blob分析的优点是HALCON提供的大量操作符提供了极大的灵活性。此外,这些方法通常具有非常高的性能。从blob分析中已知的方法也可以与许多其他视觉任务相结合,例如,作为灵活生成感兴趣区域的预处理步骤。
        Blob分析主要由三个部分组成:

获得图像后,任务是选择前景像素。这也被称为分割。这个过程的结果通常被称为blob(二进制大对象)。在HALCON中,数据类型被称为区域。在最后一步中,将计算诸如面积(即像素数)、重心或方向等特征。 

这个基本概念的一个例子是以下程序,它属于上面解释的示例。在这里,从文件中获取图像。使用阈值选择所有亮度大于120的像素。然后,引入了一个不那么明显的额外步骤:操作符连接将所有明亮的像素集分离为所谓的连接组件。这一步的效果是,我们现在有了多个区域,而不是由阈值返回的单个区域。这个程序的最后一步是计算一些特性。在这里,操作员area_center确定其大小(像素数)和重心。请注意,area_center为所有三个特性参数返回多个值(为每个连接的组件返回一个值)。

read_image (Image, 'particle')
threshold (Image, BrightPixels, 120, 255)
connection (BrightPixels, Particles)
area_center (Particles, Area, Row, Column)

        使用感兴趣的区域可以加快系统的Blob分析。搜索斑点的区域被限制得越多,搜索就越快、越健壮。有关详细信息,请参见第27页对此方法的描述。在某些应用程序中,感兴趣的区域必须相对于另一个对象对齐。或者,图像本身可以对齐,例如,通过旋转或裁剪它。如何使用基于形状的匹配进行对齐在第34页第2.4.3.2节的解决方案指南II-B中都有描述。

三、一维测量 

        一维测量(也称为一维计量或卡尺)的想法非常直观:沿着一个预定义的感兴趣区域,边缘主要垂直于感兴趣区域的方向。在这里,边缘被定义为从黑暗到明亮或从明亮到黑暗的过渡。根据提取的边缘,您可以测量零件的尺寸。例如,您可以通过将感兴趣的区域放置在零件上,并定位其左右两侧的边缘来测量零件的宽度。

        

获取图像后,您将指定要测量的位置,即描述位置、方向等。你想要测量的线或弧线。这些信息与其他一些参数一起存储在所谓的度量对象中。您可以通过使用所谓的句柄来访问度量对象。与文件句柄类似,在使用该工具时也需要此句柄。每次执行测量工具时,此句柄将作为参数传递。在像C++这样的面向对象语言中,可以使用度量类,而不是带有句柄的低级方法。在这里,使用标准的面向对象的方法实现了创建和破坏。

然后,您可以通过指定测量对象和其他一些视觉参数,如最小对比度来应用测量。 在许多情况下,测量应用程序将比上面描述的更复杂。其原因是,例如,杂乱或不均匀的照明。此外,可能需要进行后处理,如将特征转换为现实世界的单元,或结果的可视化。

        为了允许高精度的测量,相机应该有一个线性响应函数,即,图像中的灰度值应该线性地依赖于输入的能量。由于有些相机没有线性响应函数,因此HALCON提供了所谓的辐射测量校准(灰度值校准):通过操作员radiometric_self_calibration,您可以确定相机的逆响应函数(离线),然后在执行测量之前使用lut_trans将此函数应用于图像。

四、边缘提取

        寻找边缘的传统方法,即图像中的暗/光转换,是应用一个边缘滤波器。这些滤波器可以在光和暗区域的边界上找到像素。在数学术语中,这意味着这些滤波器决定了图像的梯度。此图像梯度通常作为边缘振幅和/或边缘方向返回。通过选择所有边缘振幅的像素,可以提取区域之间的轮廓。另一种寻找边的方法是使用一个训练过的深度学习模型来寻找边。该方法的优点是通过再训练模型可以进一步改进其结果。这样的再训练甚至使在自定义任务中找到特定的边成为可能。

        HALCON提供标准的边缘滤波器,如Sobel。使用边缘滤波器通常包括三个基本步骤:

 滤波:在输入图像上,应用了一个边缘滤波器。此操作会产生一到两幅图像。其结果是边缘振幅,它通常被存储为一个字节图像,每个像素的灰度值表示局部边缘振幅。可选地返回边缘的方向。这些值存储在所谓的方向图像中,值0...179表示以度除以2的角度。

边缘提取:应用边缘滤波器的结果是一个包含边缘振幅的图像。从该图像中,通过使用阈值操作符选择具有给定最小边缘振幅的像素来提取边缘。所得到的边缘通常超过一个像素,因此必须变薄。对于这个步骤,可以使用各种方法。

        下面的程序展示了边缘滤波器基本概念的示例。作为边缘滤波器,sobel_amp与“thin_sum_abs”模式与3x3滤波器掩模一起获得薄边。然后,使用操作符阈值提取边缘振幅大于20的所有像素。生成的区域包含一些边缘大于一个像素的区域。因此,操作符骨架完全应用于薄所有边。结果如图第59页的图6.1c所示。

read_image (Image, 'fuse')
sobel_amp (Image, EdgeAmplitude, 'thin_sum_abs', 3)
threshold (EdgeAmplitude, Region, 20, 255)
skeleton (Region, Skeleton)

边缘提取可以通过使用一个感兴趣的区域来加快。执行边缘滤波的区域越有限,提取速度就越快、越有鲁棒性。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_42475191

谢谢老板

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值