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

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

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

获取最小外接矩形的过程:

这里是做测试的原图

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

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

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

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

mean_image(Image : ImageMean : MaskWidth, MaskHeight : )

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


这里是经过均值滤波之后的图像

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

这里是经过动态阈值分割之后的图像

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

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

红框就是我们生成的最小外接矩形了

  1. 如果获得了多个最小外接矩形怎么办?
    在我本次的例子中虽然很顺利的生成了唯一的最小外接矩形,但是在大多数阈值分割不够完善的图像中,很容易生成多个最小外接矩形。这个时候就要考虑重新选择阈值分割的参数。
  2. 我们获取到的尺寸是物体的实际尺寸吗?
    很遗憾,到了这一步我们并没有得到物体的实际尺寸,因为在图像中没有任何一个已知尺寸的条件下,我们无法得到真实尺寸。这里得到的数值实际上是图像中的像素值,像素值可以通过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)
*合并像素相连区成为一个Elementselect_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 1if(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')

Halcon开发笔记001 尺寸测量实例分析相关推荐

  1. LabWindows CVI 2017开发笔记--串口调试软件实例

    一.新建工程 打开LabWindows CVI软件,在桌面新建SerialDebug文件夹用来保存工程文件,在欢迎页点击New–>Project 或者在软件首页点击File–>New–&g ...

  2. 基于halcon的二维椭圆测量实例

    halcon二维测量 原图 代码 结果 原图 代码 dev_close_window () read_image (Src, 'src.bmp') get_image_size (Src, Width ...

  3. LabWindows CVI 2017开发笔记--串口调试软件实例源码

    基于Labwindows CVI 2017编写的一个简单的串口调试助手,附带接收一个00–99的两位数并进行波形绘制的功能,编写过程可见:https://blog.csdn.net/Stark_/ar ...

  4. java实例分析宠物商店_java实例分析:宠物商店.ppt

    JAVA 应用开发详解 面向对象(高级) -- 实例分析:宠物商店 实例要求 实现一个宠物商店,在宠物商店中可以有多种(由用户决定数量)宠物,试表示出此种关系,并要求可以根据宠物的关键字查找到相应的宠 ...

  5. Android开发笔记(十二)测量尺寸与下拉刷新

    尺寸测量的配置 控件宽和高的设置方式 大家知道,自定义视图的目的就是要在屏幕上显示期望的图案,那在绘制图案之前,我们得先知道这个图案的尺寸(如宽多少高多少). 一般在xml中给控件的宽和高有三种赋值方 ...

  6. 小啊呜产品读书笔记001:《邱岳的产品手记-16》第30讲产品案例分析:Primer的扑克牌交互 第31讲 产品分析的套路(下):如何出解决方案?

    小啊呜产品读书笔记001:<邱岳的产品手记-16>第30讲产品案例分析:Primer的扑克牌交互 & 第31讲 产品分析的套路(下):如何出解决方案? 一.今日阅读计划 二.泛读& ...

  7. JNI开发笔记(三)--JNI工程的框架分析

    JNI工程的框架分析 引 1. JNI工程的组成部分 2. 各个部分之间的关系 引 JNI开发笔记(一)–Android Studio安装与环境搭建 JNI开发笔记(二)–创建JNI基础工程并运行 1 ...

  8. 小啊呜产品读书笔记001:《邱岳的产品手记-08》第15讲 产品案例分析:Mimo与LearnPython的导学之趣 第16讲 在内部产品中找到产品经理的价值

    小啊呜产品读书笔记001:<邱岳的产品手记-08>第15讲 产品案例分析:Mimo与LearnPython的导学之趣 & 第16讲 在内部产品中找到产品经理的价值 一.今日阅读计划 ...

  9. 小啊呜产品读书笔记001:《邱岳的产品手记-02》 开篇词 产品经理的世界没有对错 01讲 验证码是个好设计吗 02讲 产品经理工具指南 03讲 产品案例分析·Trigraphy的设计哲学

    小啊呜产品读书笔记001:<邱岳的产品手记-02> 开篇词 产品经理的世界没有对错 & 01讲 验证码是个好设计吗 & 02讲 产品经理工具指南 & 03讲 产品案 ...

最新文章

  1. GitHub有望在中国开设子公司?
  2. 重磅 | 最全PPT实录!英伟达发布可编程AI推理加速器TensorRT
  3. 苹果的安全神话即将结束?No!
  4. 给大家推荐个学英语的网站
  5. 导向滤波python_导向滤波(Guided Filter)简要介绍
  6. 戴尔塔式服务器各型号,戴尔_PowerEdge T440_塔式服务器_网络存储服务器_服务器 | Dell 中国大陆...
  7. 基于visual Studio2013解决C语言竞赛题之1089牛虎过河
  8. Python 列表排序方法reverse、sort、sorted详解
  9. 牛客题霸 [输出二叉树的右视图] C++题解/答案
  10. jsp页面中JSTL/EL标签引用java后台静态static字段的方法总结
  11. ExtJS Grid Column Number
  12. Map集合使用get方法返回null抛出空指针异常问题
  13. 【TypeScript】TypeScript 学习 3——类
  14. Linux内存管理:Swap介绍以及如何使交换具有可扩展性
  15. GS(道具,帮会)定时存储
  16. (转)给趋势投资信仰充值:动量模型百年赚钱史
  17. python泊松_Poisson Distribution——泊松分布
  18. 什么是CPU Die?
  19. mac下玩英雄联盟LoL国服的新办法
  20. 注册微信小程序并开通微信支付流程

热门文章

  1. 从会员标签到画像 应该怎么做?
  2. 编译原理三大圣书——龙书、虎书、鲸…
  3. Win8消费者预览版
  4. 性格测试软件帖子,全球最权威的性格测试
  5. c语言ceiling的使用方法,C# Math.Ceiling()用法及代码示例
  6. 【跳槽】回头草,该不该吃?能不能吃?
  7. prusai3打印机使用教程_3d打印机prusai3diy全过程【分享全部源码电路图】
  8. oracle sql子串替换,【总结】Oracle sql 中的字符(串)替换与转换
  9. ecshop二次开发-- 添加手机短信接口实例
  10. 压缩包设置了打开密码忘记了怎么办?