Halcon开发笔记001 尺寸测量实例分析

您所在的位置:网站首页 平行四边形尺寸怎么测量 Halcon开发笔记001 尺寸测量实例分析

Halcon开发笔记001 尺寸测量实例分析

2024-06-16 23:53| 来源: 网络整理| 查看: 265

课题需要对图像中的缺陷进行尺寸评价,开发环境是Halcon。

选择使用最小外接矩形方法,原因主要是

可获得的评价参数多:长度,宽度,角度,长宽比,面积通过长宽比参数可以判定缺陷形状

获取最小外接矩形的过程: 这里是做测试的原图 这里是做测试的原图

图像分割 选取合适的阈值比较困难。考虑到是工厂环境,采光可能不均匀,也为了测试方便(主要使用手机拍照,光源是环境光和手机闪光灯), 采用动态阈值分割法,Halcon提供了一个函数:

dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : )

其中第一个参数是原始图片,第二个参数是包含本地阈值的图片(用来获取灰度参考值),第三个参数是分割后得到的区域输出,第四个参数是阈值偏移量,第五个参数是问你需要暗的区域还是亮的区域。

这里有个问题,什么是包含本地阈值的图片?这里可以使用一个函数,先获取一张经过平均阈值处理的图片。

mean_image(Image : ImageMean : MaskWidth, MaskHeight : )

大概思路是使用高斯滤波,将每几个点的灰度值联系起来,取其平均值,比如在下图中,中间位置的灰度值取决于相邻八个点的灰度值,这样对图像中每个点进行处理,最终可以得到一张经过平滑处理的图像。 在这里插入图片描述 在这里插入图片描述 这里是经过均值滤波之后的图像

现在我们可以感性理解一下dyn_threshold这个函数:通过对比原图和局部临域之间的灰度值差,对每个局部小块获取一个局部的阈值,这样下来,对于局部灰度差异值大的图像来说可以很好地完成分割。 在这里插入图片描述 这里是经过动态阈值分割之后的图像

获取最小外接矩形 其实Halcon已经将这种非常常用的处理算法打包,直接调用函数:

smallest_rectangle2(Regions : : : Row, Column, Phi, Length1, Length2)

在这里插入图片描述红框就是我们生成的最小外接矩形了

如果获得了多个最小外接矩形怎么办? 在我本次的例子中虽然很顺利的生成了唯一的最小外接矩形,但是在大多数阈值分割不够完善的图像中,很容易生成多个最小外接矩形。这个时候就要考虑重新选择阈值分割的参数。我们获取到的尺寸是物体的实际尺寸吗? 很遗憾,到了这一步我们并没有得到物体的实际尺寸,因为在图像中没有任何一个已知尺寸的条件下,我们无法得到真实尺寸。这里得到的数值实际上是图像中的像素值,像素值可以通过dpi换算成尺寸,但是这个尺寸仅仅指的是图片在1:1打印后的尺寸,我们需要在图片中画下一个标尺,通过换算得到实际尺寸。 在我的课题中,有一部分是测量系统的硬件设计,镜头到物体的距离将是一个固定值,所以我可以在硬件确定后通过测试得到一个转换公式,以此获得实际尺寸。 dev_close_window() dpi:=72 *这里做出说明,dpi是根据相机变化的参数,需要自行调整 read_image (image, 'D:/毕业设计/image/40x40.jpg') get_image_size(image, Width, Height) dev_open_window(0, 0, Width/4, Height/4, 'black', WindowHandle) mean_image (image, ImageMean, 101, 101) dyn_threshold (image, ImageMean, Region, 1, 'dark') *使用动态阈值分割图像 connection(Region, ConnectedRegions) *合并像素相连区成为一个Element select_shape (ConnectedRegions, SelectedRegions, 'height', 'or', 1000, 100000) *SelectedRegions:=Region *选择具有特定特征的区域 smallest_rectangle2(SelectedRegions, Row, Column, Phi, Length1, Length2) tuple_max(Length1,MaxLength1) for Index := 0 to |Length1|-1 by 1 if(Length1[Index]==MaxLength1) MaxLength2:=Length2[Index] MaxRow:=Row[Index] MaxColumn:=Column[Index] MaxPhi:=Phi[Index] endif endfor //将最大的最小外接矩形提取出来 dev_set_color('pink') dev_set_line_width(5) dev_set_draw('margin') dev_set_color('red') gen_rectangle2(Rectangle, MaxRow, MaxColumn, MaxPhi, MaxLength1, MaxLength2) disp_message(WindowHandle,'宽度为:'+MaxLength2/dpi*25.4, 'window',0,0, 'black', 'true') disp_message(WindowHandle,'长度为:'+MaxLength1/dpi*25.4, 'window', 0,100, 'black', 'true') disp_message(WindowHandle,'角度为:'+MaxPhi, 'window',0,200, 'black', 'true')


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3