一、HALCON学习笔记(容器液位缺陷检测)

* In this example a fill level check for the
* pharmaceutical industry is demonstrated. The task is
* to check for the fill level of each single nose drop ampoule.
* To do so, we first locate each ampoule head by applying
* shape-based matching, then we find the fill level
* by measuring the gray level change using a 1D Measuring.
*
* 1 绘图设置
dev_close_window ()
dev_update_off ()
read_image (Image, 'ampoules/ampoules_01')
get_image_size (Image, Width, Height)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_set_line_width (2)
dev_set_draw ('margin')
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
*
* Create a model for the ampoule head to align the measure handle
* 2 创建形状模板
gen_rectangle1 (Rectangle, 230, 280, 317, 330)
reduce_domain (Image, Rectangle, ImageModel)
create_shape_model (ImageModel, 'auto', 0, 0, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
*
* Initialize the measure handle
* 3 初始化测量句柄 准备提取垂直于矩形的直线边。
gen_measure_rectangle2 (0, 0, rad(90), 75, 20, Width, Height, 'bilinear', MeasureHandle)
Tolerance := 15
*
* Determine the fill level
* 4 确定填充水平
NumImages := 8
for Index := 1 to NumImages by 1read_image (Image, 'ampoules/ampoules_' + Index$'.2d')ColumnEdges := []FillLevelHeight := []* 5 模板匹配,找到瓶口行坐标find_shape_model (Image, ModelID, 0, 0, 0.7, 0, 0.1, 'least_squares', 0, 0.9, Row, Column, Angle, Score)* 6 求匹配到的平均行坐标MeanRow := mean(Row)* 液位范围矩形参考行坐标RefLevel := MeanRow - 160* Display tolerance areadev_display (Image)dev_set_line_width (1)dev_set_color ('white')* 7 绘制正常液位参考矩形gen_rectangle2 (AcceptLevel, RefLevel, mean(Column), 0, 30 + (max(Column) - min(Column)) / 2, Tolerance)dev_display (AcceptLevel)dev_set_line_width (2)* *  Determine fill level of each ampouleErrors := 0for Idx := 0 to |Score| - 1 by 1* 8 准备提取垂直于矩形的直线边 -> 转换一个度量对象translate_measure (MeasureHandle, MeanRow - 135, Column[Idx])* Search for the topmost edge* 9 提取垂直于矩形或环形圆弧的直线边缘measure_pos (Image, MeasureHandle, 2, 7, 'all', 'first', RowEdge, ColumnEdge, Amplitude, Distance)* 10 保存单个容器液位坐标FillLevelHeight := [FillLevelHeight,RowEdge]ColumnEdges := [ColumnEdges,ColumnEdge]* 11 为每个输入点(液位)生成一个十字形的XLD轮廓线gen_cross_contour_xld (Cross, RowEdge, ColumnEdge, 15, 0)gen_rectangle2 (FillLevel, RowEdge, ColumnEdge, 0, 28, 20)* 12 判断液位是否在容忍限度内if (abs(FillLevelHeight[Idx] - RefLevel) >= Tolerance)gen_rectangle2 (Cross, MeanRow - 133, Column[Idx], 0, 35, 90)gen_cross_contour_xld (Cross, FillLevelHeight[Idx], ColumnEdges[Idx], 15, 0)gen_rectangle2 (FillLevel, FillLevelHeight[Idx], ColumnEdges[Idx], 0, 28, 20)Errors := Errors + 1dev_set_color ('red')dev_display (Cross)disp_message (WindowHandle, 'NG', 'image', FillLevelHeight[Idx] - 50, ColumnEdges[Idx] - 10, 'red', 'false')elsedisp_message (WindowHandle, 'OK', 'image', FillLevelHeight[Idx] - 50, ColumnEdges[Idx] - 10, 'green', 'false')dev_set_color ('green')endifdev_display (FillLevel)dev_display (Cross)endfor* * Check, whether the fill level is within the allowed range - does not deviate too much* from average fill level* * Display statisticsif (Errors > 0)disp_message (WindowHandle, Errors + ' BAD', 'window', 10, 12, 'red', 'true')elsedisp_message (WindowHandle, 'All OK', 'window', 10, 12, 'forest green', 'true')endifif (Index < NumImages)disp_continue_message (WindowHandle, 'black', 'true')stop ()endif
endfor
*
close_measure (MeasureHandle)
clear_shape_model (ModelID)
  • 该例程中重要的三个函数为

    • 3 初始化测量句柄 准备提取垂直于矩形的直线边。
      gen_measure_rectangle2 (0, 0, rad(90), 75, 20, Width, Height, 'bilinear', MeasureHandle)

    • 8 准备提取垂直于矩形的直线边 -> 转换一个度量对象
      translate_measure (MeasureHandle, MeanRow - 135, Column[Idx])

    • 9 提取垂直于矩形或环形圆弧的直线边缘
      measure_pos (Image, MeasureHandle, 2, 7, 'all', 'first', RowEdge, ColumnEdge, Amplitude, Distance)

  • 以上三个函数相互配合实现对图像区域内垂直于矩形的直线边的捕获,从而获得液位,最终与可容忍液位相匹配,判断是否越界,完成缺陷检测。

一、HALCON学习笔记(容器液位缺陷检测)相关推荐

  1. Halcon 学习笔记八:颜色识别

    Halcon 学习笔记八:颜色识别 一.图像处理需要的知识 二.图像处理的预处理和分割过程 二.颜色识别的方法 三.例子一 四.例子二 五.例子三 一.图像处理需要的知识 1.图像处理基础(rgb(h ...

  2. Halcon学习笔记:划痕、油污、瑕疵

    Halcon学习笔记:划痕.油污.瑕疵 划痕.油污.瑕疵,常用的方法有傅里叶变换和Blob分析. 1.表面划痕 invert_image(Image,ImageInvert1)  mult_image ...

  3. Halcon 学习笔记五:几何定位+仿射变换+测量

    Halcon 学习笔记五:几何定位+仿射变换+测量 定位流程 例子一 例子二(药片的定位) 例子三(充电宝定位) 例子四(车牌定位) 其他 定位流程 blob分析 模板匹配 (仿射变换成标准的形状) ...

  4. OpenCV for Ios 学习笔记(4)-标记检测1

    本文原始地址:OpenCV for Ios 学习笔记(4)-标记检测1 简单的标记经常是以白色块和黑色块构成的规则图形.因为我们预先知道这些因素,所以我们可以很容易检测标记. 如图: 首先,我们需要找 ...

  5. Halcon学习笔记(三)---数据类型

    Halcon学习笔记(三)---数据类型 halcon只能在单独行进行注释,不能在语句后面进行注释. 1.tuple(元组,重数) 赋值符号":=" tuple算子: (1)变量定 ...

  6. Halcon学习笔记:select_points_object_model_3d(3D对象模型阀值分割)

    Halcon学习笔记:select_points_object_model_3d 3D对象模型阀值分割 This example program shows how to use the operat ...

  7. Halcon学习笔记:xyz_attrib_to_object_model_3d示例

    Halcon学习笔记:xyz_attrib_to_object_model_3d--从X.Y和Z图像中创建3D对象模型同时附加属性 xyz_attrib_to_object_model_3d.hdev ...

  8. Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例

    Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例 一.基本概念 基本流程为: 获取图像 对图像进行灰度值标定 (针对相机获取的图像灰度和输入能量之间的非线性关系, ...

  9. Halcon学习笔记(一):Qt+Halcon联合开发配置

    Halcon学习笔记(1):Qt+Halcon联合开发配置 首先是新建一个QT项目qtest_hc 方法一: 1)QT项目文件 qtest_hc 添加库: #1.包含目录添加 INCLUDEPATH ...

最新文章

  1. Educational Codeforces Round 11C. Hard Process two pointer
  2. 零基础学习Java,全方位知识点总结!
  3. matlab7.x答案,MATLAB习题及参考答案
  4. 彻底理解ThreadLocal(转)
  5. 响应式电脑修理公司织梦网站模板,DedeCMS自适应手机版蓝色HTML5电脑修理维修店网站源码下载
  6. spine 导出纹理_Spine入门 —— 纹理打包
  7. mybatis plus分页插件 total数为0
  8. 计算机学报在线阅读,ei收录的计算机类核心源:计算机研究与发展计算机学报软件.doc...
  9. vbox 虚拟机支持ipv6
  10. 大工14秋计算机英语3,【大工作业】秋季《大学英语3》在线测试2包100
  11. 从《哪吒之魔童降世》票房火爆,看国产动画产业市场化三十年
  12. A problem occurred configuring root project ‘xxx‘.
  13. Vue最佳实践(项目经验总结,定期更新)
  14. H5页面分享到朋友圈,自定义标题描述封面图 前端+php代码
  15. 技能冷却: 判断技能 释放技能
  16. 神舟电脑文件丢失怎么办?分享文件丢失常见原因和恢复方法
  17. 测试工程师面试,全国各地有哪些知名互联网公司可以去?
  18. Android学习之Socket多个客户端即时通信聊天
  19. linux更换进程执行码,第八节 进程的切换和系统的一般执行过程—— 20135203齐岳...
  20. 利用七牛云作为图片服务器

热门文章

  1. HTML5 autofocus属性
  2. 卧兔网络开启全球红人分销功能,WotoHub上线Shopify应用商店!
  3. Skia Windows 编译
  4. Android自定义menu菜单布局
  5. android 仿ios悬浮窗,iOS高仿微信悬浮窗、忍者小猪游戏、音乐播放器、支付宝、今日头条布局滚动效果等源码...
  6. .编译实现输入千米数,输出显示英里数,1英里=1.60934千米(用符号常量)
  7. Math.floor() 返回小于或等于一个给定数字的最大整数。
  8. kubernets controller 和 CRD的扩展
  9. opencv实现哈哈镜变换
  10. 谈谈所谓“掉价”的行为