HALCON示例程序check_fish_stick_dimension.hdev生鱼棒尺寸测量;基于形态学的像素级精度尺寸测量

HALCON示例程序check_fish_stick_dimension.hdev基于形态学的像素级精度尺寸测量

示例程序源码(加注释)

  • 关闭实时显示更新
    dev_update_off ()

  • 关闭窗口
    dev_close_window ()

  • 读入图片
    read_image (Image, ‘food/fish_sticks_raw_01’)

  • 根据给定长宽比开辟窗口并显示图像
    dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)

  • 设置字体显示格式
    set_display_font (WindowHandle, 16, ‘mono’, ‘true’, ‘false’)

  • 区域以边缘形式进行显示
    dev_set_draw (‘margin’)

  • 获取系统关于“空白区域储存的设置”并进行设置,上一篇介绍过了
    get_system (‘store_empty_region’, StoreEmptyRegion)
    set_system (‘store_empty_region’, ‘true’)

  • 变量的声明与赋值
    cm_per_pix := 0.0373
    TargetLength := 9.0
    ToleranceHigh := 0.8
    ToleranceLow := 0.2

  • 定义图片数量
    NumImages := 10

  • 循环检测
    for I := 1 to NumImages by 1

    • 读入图片
      read_image (Image, ‘food/fish_sticks_raw_’ + I$’.2’)

    • 分割生鱼棒,将测量区域提取出来

    • 阈值分割选取灰度值在50-255的像素
      threshold (Image, Region, 50, 255)

    • 分割连通域
      connection (Region, ConnectedRegions)

    • 填充孔洞,使选取的生鱼棒完整
      fill_up (ConnectedRegions, RegionFillUp)

    • 筛选面积在1000-99999的区域,消除杂点干扰
      select_shape (RegionFillUp, SelectedRegions, ‘area’, ‘and’, 1000, 99999)

    • 选择不与图像边框相交的区域,不检测与图像边缘相交的生鱼棒,因为它不完整

    • 使用形态学运算来计算区域的边界,这里就是将图片边界提取出来
      boundary (Image, RegionBorder, ‘inner’)

    • 求图像边界与提取出生鱼棒区域的交集,如果有交集那么证明有生鱼棒位于图像边界,不进行检测。
      intersection (SelectedRegions, RegionBorder, RegionIntersection)

    • 求解上一步求出的交集的面积与坐标
      area_center (RegionIntersection, Area, Row1, Column1)

    • find(Area,0)这个算子意思是在Area数组里边寻找0这个元素,并且返回索引号;这里又在后边加

    • 了个 1,交集区域为空所以 Area:=[0,0,0,0],find(Area,0):=[0,1,2,3],

    • ValidRegionIndices := [1,2,3,4];如果find在Area数组内没有找到0,则返回-1
      ValidRegionIndices := find(Area,0) + 1

    • 如果ValidRegionIndices第一个元素不等0;ValidRegionIndices := []为空
      if (ValidRegionIndices[0] == 0)
      ValidRegionIndices := []
      endif

    • halcon自定义函数,目的在数组(第一个参数)寻找大于数值(第二个参数)的值,并返回索引号。
      select_tuple_larger (Area, 0.0, RegionAtBorderIndices)

    select_tuple_larger函数内部代码:
    ** sgn()返回数值的符号,(-1,0,1) **这里就是数组里边的值与输入值相减,根据符号判断1为正,之后用find返回数组数值为1的索引号
    tuple_find (sgn(Tuple - Value), 1, Indices)
    if (Indices[0] == -1)
    Indices := []
    endif
    return ()

    RegionAtBorderIndices := RegionAtBorderIndices + 1

    • select_obj 在元组中选取指定对象

    • 选取要正常测量的区域
      select_obj (SelectedRegions, ValidSticks, ValidRegionIndices)

    • 选取位于边界的区域
      select_obj (SelectedRegions, StickAtBorder, RegionAtBorderIndices)

    • 测量生鱼棒的尺寸

    • 求取生鱼棒的可旋转最小外接矩形
      smallest_rectangle2 (ValidSticks, Row, Column, Phi, Length1, Length2)

    • 求取生鱼棒的实际长度,用像素个数乘以像素尺寸
      FishLength1 := Length1 * 2 * cm_per_pix

    • 选取尺寸大于最小要求尺寸的生鱼棒
      select_tuple_larger (FishLength1, TargetLength - ToleranceLow, IndicesGood)

    • 选取尺寸大于最大要求尺寸的生鱼棒
      select_tuple_larger (FishLength1, TargetLength + ToleranceHigh, IndicesBad1)

    • tuple_remove从元组中删除元素,将尺寸大于最大要求尺寸的生鱼棒剔除
      tuple_remove (IndicesGood, IndicesBad1, IndicesGood)

    • 选取小于最小要求尺寸的生鱼棒
      select_tuple_larger (-FishLength1, -(TargetLength - ToleranceLow), IndicesBad2)

    • 将大于最大要求尺寸与小于最小要求尺寸的坏的生鱼棒的索引号合并到一个坏的生鱼棒的数组
      IndicesBad := [IndicesBad1,IndicesBad2]

    • subset()选择元组元组的一个或多个单个元素,相当于将好坏的坐标选取出来
      RowGood := subset(Row,IndicesGood)
      ColumnGood := subset(Column,IndicesGood)
      RowBad := subset(Row,IndicesBad)
      ColumnBad := subset(Column,IndicesBad)
      FishLength1Good := subset(FishLength1,IndicesGood)
      FishLength1Bad := subset(FishLength1,IndicesBad)

    • 绘制外接矩形框
      if (|IndicesGood| > 0)
      gen_rectangle2 (GoodSticks, RowGood, ColumnGood, subset(Phi,IndicesGood), subset(Length1,IndicesGood), subset(Length2,IndicesGood))
      else
      gen_empty_obj (GoodSticks)
      endif
      if (|IndicesBad| > 0)
      gen_rectangle2 (BadSticks, RowBad, ColumnBad, subset(Phi,IndicesBad), subset(Length1,IndicesBad), subset(Length2,IndicesBad))
      else
      gen_empty_obj (BadSticks)
      endif

    • 显示结果
      dev_display (Image)
      dev_set_color (‘white’)
      dev_set_line_width (1)
      dev_display (ValidSticks)
      dev_set_line_width (3)
      dev_set_color (‘yellow’)
      dev_display (StickAtBorder)
      dev_set_color (‘green’)
      dev_display (GoodSticks)
      dev_set_color (‘red’)
      dev_display (BadSticks)

    • ′.1f′这个是代表浮点数显示小数点后一位String:=′Targetlength:′+TargetLength'.1f'这个是代表浮点数显示小数点后一位 String := 'Target length: ' + TargetLength.1fString:=Targetlength:+TargetLength‘.1f’ + ’ cm’
      String[1] := ‘Tolerance: -’ + ToleranceLow′.1f′+′/+′+ToleranceHigh'.1f' + '/+' + ToleranceHigh.1f+/++ToleranceHigh’.1f’
      disp_message (WindowHandle, String, ‘window’, 12, 12, ‘black’, ‘true’)

    for J := 0 to |IndicesGood| - 1 by 1
    disp_message (WindowHandle, ‘OK’, ‘image’, 80, ColumnGood[J] - 10, ‘green’, ‘false’)
    disp_message (WindowHandle, FishLength1Good[J]′.1f′+′cm′,′image′,RowGood[J],ColumnGood[J]−28,′white′,′false′)endforforJ:=0to∣IndicesBad∣−1by1dispmessage(WindowHandle,′NotOK′,′image′,80,ColumnBad[J]−30,′red′,′false′)dispmessage(WindowHandle,FishLength1Bad[J]'.1f' + 'cm', 'image', RowGood[J], ColumnGood[J] - 28, 'white', 'false') endfor for J := 0 to |IndicesBad| - 1 by 1 disp_message (WindowHandle, 'Not OK', 'image', 80, ColumnBad[J] - 30, 'red', 'false') disp_message (WindowHandle, FishLength1Bad[J].1f+cm,image,RowGood[J],ColumnGood[J]28,white,false)endforforJ:=0toIndicesBad1by1dispmessage(WindowHandle,NotOK,image,80,ColumnBad[J]30,red,false)dispmessage(WindowHandle,FishLength1Bad[J]’.1f’ + ‘cm’, ‘image’, RowBad[J], ColumnBad[J] - 28, ‘white’, ‘false’)
    endfor
    if (I != NumImages)
    disp_continue_message (WindowHandle, ‘black’, ‘true’)
    stop ()
    endif
    endfor

  • 恢复系统设置
    set_system (‘store_empty_region’, StoreEmptyRegion)

处理思路

普通的形态学进行区域的分割与测量,这个例子给我最大的收获就是如何找到与图像边界重叠的区域,还有关于halcon下数组相关的操作,比如sgn、find、select_obj、subset等。

后记

大家有什么问题可以向我提问哈,我看到了第一时间回复,希望在学习的路上多多结交良师益友。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单片机平台的最小偏差圆弧插补算法

在CNC机床的G代码中,最常见的有G0、G1、G2、G3代码,分别表示直线和圆弧插补,直线插补对于单片机来说,比较容易实现,只需要将位移增量转换为脉冲增量然后输出给步进电机就可以了,但对于圆弧插补,…

javascript基础--数组排序

字符串的排序 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>数组排序</title><script>var arr [fliar, asdf, dfe, loii, yhhl];arr.sort();alert(arr);</script> </head>&…

【转】JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)

这里说的js跨域是指通过js在不同的域之间进行数据传输或通信&#xff0c;比如用ajax向一个不同的域请求数据&#xff0c;或者通过js获取页面中不同域的框架中(iframe)的数据。只要协议、域名、端口有任何一个不同&#xff0c;都被当作是不同的域。 下表给出了相对http://store.…

Lua基本语法-lua与C#的交互(相当简单详细的例子)

lua脚本 与 C#的交互 本文提供全流程&#xff0c;中文翻译。Chinar坚持将简单的生活方式&#xff0c;带给世人&#xff01;&#xff08;拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例&#xff09; 1Lua And C# —— Lua 和 C#的交互准备工作 2C# Create Lu…

漫谈程序员系列:千奇百怪的程序员

干开发时间长了&#xff0c;遇见好多好玩儿的程序员。 看看你躺枪了没。 博客之星评选&#xff0c;点击投我一票&#xff0c;谢谢。投过了也可以点哦&#xff0c;每天都可以投投一票。 留一手 有个哥们儿&#xff0c;在一合资公司做程序员&#xff0c;能力挺强&#xff0c;写…

HALCON示例程序check_hazelnut_wafers.hdev威化饼干质量检测(完整与否,是否破碎)

HALCON示例程序check_hazelnut_wafers.hdev威化饼干质量检测&#xff08;完整与否&#xff0c;是否破碎&#xff09; 示例程序源码&#xff08;加注释&#xff09; 读入图片 read_image (Image, ‘food/hazelnut_wafer_01’) 关闭窗口 dev_close_window () 根据给定的长宽比…

Windows Media Center .MCL文件代码执行漏洞(MS16-059)

blast 2016/06/21 13:180x00 简介漏洞作者EduardoBraun Prado在今年早期发现了WMP的.MCL文件又存在一个可以导致远程代码执行的漏洞。为什么要说又呢&#xff0c;因为这个东西实在是“不争气”&#xff0c;同一个地方出现了多次绕过导致远程代码执行的问题。0x01 历史A――MS1…

SCARA机器人与 DELTA机器人

1、SCARA机器人SCARA&#xff08;Selective Compliance Assembly Robot Arm&#xff0c;中文译名&#xff1a;选择顺应性装配机器手臂&#xff09;是一种圆柱坐标型的特殊类型的工业机器人。1978年&#xff0c;日本山梨大学牧野洋发明SCARA&#xff0c;该机器人具有四个轴和四个…

一直以来都没直视的轮播-_-

一直以来做项目碰到轮播图我都是去网站上找现成插件拿来用&#xff0c;现成的插件1是省时间&#xff0c;拿来改改尺寸改改参数就能直接用&#xff0c;2是现在的插件确实很强大&#xff0c;对于我一个刚刚学习前端的人来说&#xff0c;牛人写的轮播我看懂也要花些功夫&#xff0…

HALCON示例程序circles.hdev边界轮廓的圆形拟合

HALCON示例程序circles.hdev边界轮廓的圆形拟合 小哥哥小姐姐觉得有用点个赞呗&#xff01; 示例程序源码&#xff08;加注释&#xff09; 读入图片 read_image (Image, ‘double_circle’)窗口初始化 dev_close_window () get_image_size (Image, Width, Height) dev_open…

asp.net 微信企业号办公系统-流程设计--保存与发布

如果流程未设计完时可以先保存&#xff0c;以后再打开接着设计。点击工具栏上的保存按钮即可保存当前流程设计: 如果下次要接着设计&#xff0c;则可以打开该流程继续设计&#xff1a; 如果流程设计完成&#xff0c;可以点击安装按钮来发布流程&#xff0c;流程安装成功后即加入…

search-guard 在 Elasticsearch 2.3 上的运用

uni3orns 2016/06/23 11:09Author&#xff1a;uni3orns参考内容&#xff1a;kibana.logstash.es/content/ela…groups.google.com/forum/#!for…github.com/floragunnco…此文章基于以下软件版本&#xff0c;不同版本可能略有差异&#xff1a;elasticsearch 2.3.3search-guard…

HALCON示例程序class_2dim_sup.hdev使用二维像素分类对图像进行分割

HALCON示例程序class_2dim_sup.hdev使用二维像素分类对图像进行分割 示例程序源码&#xff08;加注释&#xff09; 定义Interactive并赋值&#xff0c;0&#xff1a;固定框&#xff1b;1&#xff1a;手工绘制框。 Interactive : 0 读入图片 read_image (Image, ‘ic’) 关闭…

sys

sys.argv 命令行参数List&#xff0c;第一个元素是程序本身路径 sys.exit(n) 退出程序&#xff0c;正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.maxint 最大的Int值 sys.path 返回模块的搜索路径&#xff0c;初…

修改环境变量

在path变量后添加&#xff0c;对变量长度无限制&#xff0c;需要重启后生效reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_SZ /d "%path%;c:\newpath;whatever" /freg save "HKLM\SYSTEM\CurrentCont…

Canny边缘检测算法原理及其VC实现详解(二)

3、 Canny算法的实现流程 由于本文主要目的在于学习和实现算法&#xff0c;而对于图像读取、视频获取等内容不进行阐述。因此选用OpenCV算法库作为其他功能的实现途径&#xff08;关于OpenCV的使用&#xff0c;作者将另文表述&#xff09;。首先展现本文将要处理的彩色图片。 …

IDEA注册jar包使用和常用插件

IDEA注册jar包使用 点击获取下载地址或生成注册码 一、安装完成后&#xff0c;先不启动&#xff0c;首先如下图修改相关的地方。 二、启动IDEA&#xff0c;并且激活IDEA IDEA插件仓库 IntelliJ IDEA Plugins 一、Maven Helper 我一般用这款插件来查看maven的依赖树。在不使用此…

HALCON示例程序class_2dim_unsup.hdev基于二维直方图的聚类分类

HALCON示例程序class_2dim_unsup.hdev基于二维直方图聚类分类的颜色分类 示例程序源码&#xff08;加注释&#xff09; 读入图片 read_image (Image, ‘patras’)关闭窗口 dev_close_window ()得到图片尺寸大小 get_image_size (Image, Width, Height)打开窗口 dev_open_wind…

Android Monkey压力测试

一. JAVA环境的搭建 安装jdk-8u151-windows-x64,可以到官网或者应用中心下载.JAVA环境变量的搭建: 在"我的电脑"-"属性"-"高级"-"环境变量"中,点击新建,填写变量名为JAVA_HOME,变量值为JAVA安装的路径.在系统变量中找到Path,点击编辑,…

bzoj 4517: [Sdoi2016]排列计数

4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 637 Solved: 396[Submit][Status][Discuss]Description 求有多少种长度为 n 的序列 A&#xff0c;满足以下条件&#xff1a;1 ~ n 这 n 个数在序列中各出现了一次若第 i 个数 A[i] 的值为 i&#x…