* 本示例演示了使用单个参考图像进行打印检查的过程。

* 读取参考图像并初始化程序。
read_image (Image, 'relay/relay_01')
dev_close_window ()
dev_open_window_fit_image (Image, 0, 0, 600, 500, WindowHandle1)
set_display_font (WindowHandle1, 16, 'mono', 'true', 'false')
dev_update_off ()
dev_display (Image)
get_image_size (Image, Width, Height)
Pi := rad(180)

* 读取已人为预定义的兴趣区域。
read_region (ROI, 'relay/relay_inspection_roi.reg')
reduce_domain (Image, ROI, ImageReduced)

*显示参考图像。
dev_clear_window ()
dev_display (ImageReduced)
dev_disp_text ('Reference image', 'window', 12, 12, 'black', [], [])
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()

* 在此应用中,通过使用边缘幅度作为标准偏差的近似值,从单个参考图像创建变化模型。
Sigma := 0.5
edges_image (ImageReduced, ImaAmp, ImaDir, 'canny', Sigma, 'none', 20, 40) //使用Deriche,Lanser,Shen或Canny过滤器提取边缘。
gray_dilation_rect (ImaAmp, VariationImage, 3, 3) //确定矩形内的最大灰度值,灰度膨胀使得被检测图像与参考图像间的允许误差增加。参考图像ImageReduced生成--->偏差模型VariationImage,

* 显示变化图像。
dev_clear_window ()
dev_display (VariationImage)
dev_disp_text ('Variation image', 'window', 12, 12, 'black', [], [])
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()

* 创建偏差模型。
AbsThreshold := 15
VarThreshold := 1
create_variation_model (Width, Height, 'byte', 'direct', VarModelID) //创建用于图像比较的变化模型。
prepare_direct_variation_model (ImageReduced, VariationImage, VarModelID, AbsThreshold, VarThreshold) //准备一个变化模型以与图像进行比较。ImageReduce参考图像,VariationImage偏差图像

*创建形状模型以对齐测试图像。 为了加快匹配速度,仅将打印件的一部分用作模板。为了被测图像与参考图像进行比较,两个图像必须很好的对齐,使用鲁棒的模板匹配来确定这两幅图像间的偏差量
read_region (MatchingROI, 'relay/relay_matching_roi') //读取图像ROI区域
reduce_domain (Image, MatchingROI, Template) //缩小图像的域。
create_shape_model (Template, 5, -rad(5), rad(10), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ShapeModelID) //准备一个形状模型以进行匹配。
area_center (MatchingROI, ModelArea, ModelRow, ModelColumn) //区域中心点

*仅出于可视化目的提取亚像素精确边缘。
edges_sub_pix (ImageReduced, Edges, 'sobel_fast', 0.5, 10, 20) //使用Deriche,Lanser,Shen或Canny滤镜提取亚像素精确边缘。

* 检查多个继电器上的印记。
for Index := 2 to 6 by 1
    * 
    * 读取测试图片
    read_image (Image, 'relay/relay_' + Index$'02d')
    * 
    * 确定打印在测试图像中的确切位置。
    find_shape_model (Image, ShapeModelID, -rad(5), rad(10), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
    * 
    * 检查压印是否可以找到。
    if (|Score| == 1)
        * 
        * 将图像与参考图像对齐。
        vector_angle_to_rigid (Row, Column, Angle, ModelRow, ModelColumn, 0, HomMat2D) //从点和角度计算刚性仿射变换。
        affine_trans_image (Image, ImageAligned, HomMat2D, 'constant', 'false') //将任意仿射2D变换应用于图像。
        * 
        * 将当前测试图像与参考图像进行比较。
        reduce_domain (ImageAligned, ROI, ImageAlignedReduced)
        compare_variation_model (ImageAlignedReduced, RegionDiff, VarModelID) //将图像与变化模型进行比较。
        * 
        * 选择打印印记中错误的区域。
        MinComponentSize := 5 
        dilation_circle (RegionDiff, RegionDilation, 3.5) //使用圆形结构元素扩展区域。
        connection (RegionDilation, ConnectedRegions) 
        intersection (ConnectedRegions, RegionDiff, RegionIntersection) //计算两个区域的交点。
        select_shape (RegionIntersection, SelectedRegions, 'area', 'and', MinComponentSize, ModelArea) //借助形状特征选择区域。
        * 
        * 显示结果。
        dev_display (ImageAligned)
        count_obj (SelectedRegions, NumberDefects) //计算元组中的对象数。
        if (NumberDefects > 0)
            dev_disp_text ('Image ' + Index + ': ' + NumberDefects + ' Errors found', 'window', 12, 12, 'black', [], [])
            dev_set_color ('green')
            dev_set_line_width (1)
            dev_display (Edges)
            dev_set_color ('red')
            dev_set_line_width (3)
            area_center (SelectedRegions, Area, Row, Column)
            elliptic_axis (SelectedRegions, Ra, Rb, Phi) //计算等效椭圆的参数。
            gen_ellipse_contour_xld (ErrorMarker, Row, Column, Phi, Ra + 5, Rb + 5, gen_tuple_const(|Row|,0), gen_tuple_const(|Row|,6.28318), gen_tuple_const(|Row|,'positive'), 1.5) //创建对应于椭圆弧的XLD轮廓。


gen_tuple_const(|Row|,0) //用于生成特定长度的元组并且初始化其元素,创建一个具有|Row|个元素的、每个元 素都为 0 的数据


dev_display (ErrorMarker)
        else //显示:"OK"
            dev_disp_text ('Image ' + Index + ': OK', 'window', 12, 12, 'black', [], [])
            dev_set_color ('green')
            dev_set_line_width (1)
            dev_display (Edges)
        endif
    else
        if (|Score| == 0) //如果Score分数为0,显示:找不到要测试的图案
            dev_disp_text ('Image ' + Index + ': Pattern to be tested could not be found', 'window', 12, 12, 'black', [], [])
        else //显示:发现要测试的图案不明确
            dev_disp_text ('Image ' + Index + ': Pattern to be tested was found ambiguously', 'window', 12, 12, 'black', [], [])
        endif
    endif
    dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
    stop ()
endfor

* Clean up
clear_shape_model (ShapeModelID)
clear_variation_model (VarModelID)
dev_disp_text ('      End of program      ', 'window', 'bottom', 'right', 'black', [], [])

注意:

1.通过参考图像边缘振幅来估计允许误差:为了使相邻边缘对振幅计算影响较小,使用一个3*3的Canny边缘滤波算子(edges_image),并使用灰度膨胀(gray_dilation_rect )使得被检测图像与参考图像间的允许误差增加;

2.参考图像和偏差图像生成  偏差模型 : create_variation_model  、prepare_direct_variation_model

3.理一遍思路:

Halcon 《机器视觉算法及应用》十例(其四)相关推荐

  1. halcon机器视觉算法原理与编程实战_快速弄懂机器学习里的集成算法:原理、框架与实战...

    作者:  博观厚积 简书专栏:https://www.jianshu.com/u/2f376f777ef1 1. 关于集成学习算法 集成学习算法,通俗地讲就是:三个臭皮匠,顶个诸葛亮,这在很多地方都有 ...

  2. 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。

    十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...

  3. 梅卡曼德机器人| 机器视觉算法、深度学习算法、软件开发等海量岗位

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 梅卡曼德机器人 2020招聘火热进行中 梅卡曼德机器人,英文为Mech-Mind,意为机器之意识.我们 ...

  4. halcon机器视觉实例1--表面划痕检测

    前言 这个是开始halcon机器视觉的第一篇. 为什么要用halcon呢,因为有很多现成的算子,方便快速应用. 后续的计划是一边熟悉halcon,一边刷刚萨雷斯的<数字图像处理>. 正文 ...

  5. 算法系列之十四:狼、羊、菜和农夫过河问题

    算法系列之十四:狼.羊.菜和农夫过河问题 题目描述:农夫需要把狼.羊.菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷 ...

  6. 月薪20k-50k| 西人马3D机器视觉算法、语音识别、DSP软件工程师招聘

    3D视觉工坊致力于推荐最棒的工作机会,精准地为其找到最佳求职者,做连接优质企业和优质人才的桥梁.如果你需要我们帮助你发布实习或全职岗位,请添加微信号「CV_LAB」. 公司简介: 西人马FATRI是一 ...

  7. 数据结构与算法笔记(十六)—— 二叉搜索树

    一.二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: 若左子树不为空,则左子树上所有节点的 ...

  8. CV:人工智能之计算机视觉方向的简介(CV发展史+常用数据集+CV职位)、传统方法对比CNN类算法、计算机视觉十大应用(知识导图+经典案例)之详细攻略

    CV:人工智能之计算机视觉方向的简介(CV发展史+常用数据集+CV职位).传统方法对比CNN类算法.计算机视觉十大应用(知识导图+经典案例)之详细攻略 目录 计算机视觉的简介 1.计算机视觉的研究方向 ...

  9. 图漾科技招聘|机器视觉算法、嵌入式驱动开发高级工程师等岗位

    嵌入式驱动开发高级工程师 工作地点:上海 薪资:20-40K 岗位职责: 1. 负责嵌入式系统(usb\ethernet\spi\Camera sensor等)驱动开发和调试: 2. 负责评估核心系统 ...

  10. 7月算法训练------第十四天(栈)解题报告

    7月算法训练------第十四天(栈)解题报告 题目类型:栈 题目难度:简单 第一题.1614. 括号的最大嵌套深度 题目链接:1614. 括号的最大嵌套深度 思路分析: 遍历整个字符串,如果是'(' ...

最新文章

  1. C# toolstrip 上添加DateTimePicker Control控件
  2. CSS实现鼠标移入图片边框有小三角
  3. php编写函数6,编写自己的PHP扩展函数
  4. mysql varchar 225 和 varchar 60 区别
  5. UI Blue crystall class sap_bluecrystal is added here to html node
  6. 失血多少会贫血_阿胶糕治贫血两大好处,治疗贫血两大方法要掌握
  7. 使用tableView崩溃
  8. 李德玉(1965-),男,博士,山西大学计算机与信息技术学院教授
  9. Oracle11g的安装和使用
  10. 解决微信0day上线CobaltStike的几个问题
  11. 为你的简书和 GitHub 设定个性域名
  12. java编写一个方法printn_Java语言程序设计 基础篇 原书第10版 ,梁勇著 (第六章)编程练习题...
  13. 如何成为快速计算机高手,超级实用的4个电脑小技巧,1分钟教会你成为电脑高手...
  14. Java同步锁synchronized的最全总结
  15. 服务器里怎么设置微信多开,企业微信多开的4种方法
  16. 优秀java程序员必须具备的技术技能
  17. Python做一份简易旅行攻略——疫情之后,若条件允许,可愿意用一场旅行“弥补”自己
  18. 图像处理之计算二值连通区域的质心
  19. 计算机应用基础名词解释动画,《计算机应用基础》期末考试复习题库-名词解释题题库...
  20. 抖音搬运视频如何伪原创

热门文章

  1. 云队友丨抖音之后,互联网失去创造力
  2. 103 规约分析总结
  3. 超分辨率重建测试(DASR)
  4. 振动噪声测试分析软件,DASP-V11工程版 振动噪声应变冲击
  5. 程序员如何接私活?十年码农悄悄告诉你
  6. 《深入浅出数据分析》读后详解
  7. 视频教程-C++ 编写WebService服务实战-C/C++
  8. matlab与maple互联,编程语言与Maple联合使用教程
  9. AdventNet 网管管理平台
  10. mac 安装adb工具