HALCON示例程序check_blister.hdev药品胶囊检测

HALCON check_blister.hdev药品胶囊检测

示例程序源码(加注释)

  • 显示、读入图片、设置显示字体等,之前的帖子已经介绍过了
    dev_close_window ()
    dev_update_off ()
    read_image (ImageOrig, ‘blister/blister_reference’)
    dev_open_window_fit_image (ImageOrig, 0, 0, -1, -1, WindowHandle)
    set_display_font (WindowHandle, 14, ‘mono’, ‘true’, ‘false’)
    dev_set_draw (‘margin’)
    dev_set_line_width (3)

  • 第一步,我们创建一个图案,以便在后续的水泡图像中轻松切出腔室。

  • access_channel - 访问多通道图像中的指定的一个通道。这里选取Image1的第一个通道
    access_channel (ImageOrig, Image1, 1)

  • 进行阈值分割,选取灰度值在90-255的区域
    threshold (Image1, Region, 90, 255)

  • 使用shape_trans对区域Region处理,提取Region的外框,convex功能是外框
    shape_trans (Region, Blister, ‘convex’)

  • orientation_region计算区域的方向,这个算子是基于elliptic_axis 算子来的,elliptic_axis 是求取等效的椭圆,所以用算子orientation_region相当于把区域Blister转化为一个等效椭圆,计算这个椭圆的长轴在图像中的角度。
    orientation_region (Blister, Phi)

  • 求取区域Blister的面积与中心坐标。
    area_center (Blister, Area1, Row, Column)

  • vector_angle_to_rigid - 根据初始坐标(前3个参数)与仿射变换后的坐标与角度(4-6,三个参数)角度生成一个旋转与平移的仿射变换矩阵HomMat2D。这里初始坐标与结束坐标都没有变化只是角度旋转到了0度。
    vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)

  • affine_trans_image - 对图像进行任意的2D仿射变换。ImageOrig:要进行仿射变换的图像;Image2:仿射变换之后的图像;HomMat2D:2D仿射变换矩阵;constant:进行仿射变换的方式,这个代表使用均值滤波器来防止混叠效应的发生。false:仿射变换后的图片超出现有图片大小的区域不被剪切掉;若为true则相反。
    affine_trans_image (ImageOrig, Image2, HomMat2D, ‘constant’, ‘false’)

  • 生成一个空的对象Chambers
    gen_empty_obj (Chambers)

    for I := 0 to 4 by 1Row := 88 + I * 70for J := 0 to 2 by 1Column := 163 + J * 150* * 生成一个可旋转的矩形;* 前两个参数是区域中心坐标,第三个参数是矩形角度,后两个参数是矩形的宽高。gen_rectangle2 (Rectangle, Row, Column, 0, 64, 30)* * concat_obj  - 把两个对象融合在一起。* 注意,这个和union不一样,union是把两个对象整合成一个对象,整合后对象的元素个数为1;* 而使用concat_obj  是把几个对象联合成一个对象,这个对象中的元素个数之和不变。concat_obj (Chambers, Rectangle, Chambers)endforendfor
    
  • 使用变换矩阵HomMat2D对Blister区域使用nearest_neighbor方法进行仿射变换。
    affine_trans_region (Blister, Blister, HomMat2D, ‘nearest_neighbor’)

  • 求取区域Blister与区域Chambers的差集
    difference (Blister, Chambers, Pattern)

  • 将区域Chambers(有多个元素)联合成一个区域(一个元素)
    union1 (Chambers, ChambersUnion)

  • 求取区域Blister的角度
    orientation_region (Blister, PhiRef)

  • 将角度PhiRef加180度
    PhiRef := rad(180) + PhiRef

  • 求取区域Blister的面积与中心坐标
    area_center (Blister, Area2, RowRef, ColumnRef)

  • 循环检测每一张图片

  • 定义变量Count 赋值6
    Count := 6

  • for循环
    for Index := 1 to Count by 1

    • 读入图片
      read_image (Image, ‘blister/blister_’ + Index$‘02’)

    • 对图片Image进行阈值分割,提取像素灰度值在90-255的区域
      threshold (Image, Region, 90, 255)

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

    • 使用select_shape 对区域ConnectedRegions进行筛选,筛选出面积值介于5000-999999的区域
      select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 5000, 9999999)

    • 求取区域SelectedRegions的外形
      shape_trans (SelectedRegions, RegionTrans, ‘convex’)

    • 求取区域RegionTrans的角度
      orientation_region (RegionTrans, Phi)

    • 求取区域RegionTrans的面积与中心坐标
      area_center (RegionTrans, Area3, Row, Column)

    • 生成仿射变换矩阵HomMat2D
      vector_angle_to_rigid (Row, Column, Phi, RowRef, ColumnRef, PhiRef, HomMat2D)

    • 使用HomMat2D矩阵对Image进行仿射变换
      affine_trans_image (Image, ImageAffinTrans, HomMat2D, ‘constant’, ‘false’)

    • 使用区域剪切图片,缩小图像处理定义域
      reduce_domain (ImageAffinTrans, ChambersUnion, ImageReduced)

    • 将图片ImageReduced分成R/G/B三通道图像
      decompose3 (ImageReduced, ImageR, ImageG, ImageB)

    • var_threshold - 通过局部均值和标准差分析对图像进行阈值处理。
      var_threshold (ImageB, Region, 7, 7, 0.2, 2, ‘dark’)

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

    • 使用矩形对区域进行闭运算
      closing_rectangle1 (ConnectedRegions0, ConnectedRegions, 3, 3)

    • 填充孔洞
      fill_up (ConnectedRegions, RegionFillUp)

    • 进行面积筛选
      select_shape (RegionFillUp, SelectedRegions, ‘area’, ‘and’, 1000, 99999)

    • 使用圆形元素对区域进行开运算
      opening_circle (SelectedRegions, RegionOpening, 4.5)

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

    • 进行面积筛选
      select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 1000, 99999)

    • 求取区域轮廓
      shape_trans (SelectedRegions, Pills, ‘convex’)

    • 对区域Chambers进行计数
      count_obj (Chambers, Number)

    • 生成一个空的对象
      gen_empty_obj (WrongPill)

    • 生成一个空的对象
      gen_empty_obj (MissingPill)

    • for循环
      for I := 1 to Number by 1

      • 在对象数组中选取指定对象,之前例子已经讲过了
        select_obj (Chambers, Chamber, I)
      • 求交集
        intersection (Chamber, Pills, Pill)
      • 求取区域面积与中心坐标值
        area_center (Pill, Area, Row1, Column1)

      if (Area > 0)
      * 求取最大最小的灰度值,之前例子已经讲过了
      min_max_gray (Pill, ImageB, 0, Min, Max, Range)
      if (Area < 3800 or Min < 60)
      * 联合对象,上边有介绍
      concat_obj (WrongPill, Pill, WrongPill)
      endif
      else
      * 联合对象,上边有介绍
      concat_obj (MissingPill, Chamber, MissingPill)
      endif
      endfor

    • 下面的就是显示了
      dev_clear_window ()
      dev_display (ImageAffinTrans)
      dev_set_color (‘forest green’)
      count_obj (Pills, NumberP)
      count_obj (WrongPill, NumberWP)
      count_obj (MissingPill, NumberMP)
      dev_display (Pills)
      if (NumberMP > 0 or NumberWP > 0)
      disp_message (WindowHandle, ‘Not OK’, ‘window’, 10, 10 + 600, ‘red’, ‘true’)
      else
      disp_message (WindowHandle, ‘OK’, ‘window’, 10, 10 + 600, ‘forest green’, ‘true’)
      endif
      disp_message (WindowHandle, '# correct pills: ’ + (NumberP - NumberWP), ‘window’, 10, 10, ‘black’, ‘true’)
      disp_message (WindowHandle, '# wrong pills : ’ + NumberWP, ‘window’, 10 + 25, 10, ‘black’, ‘true’)
      if (NumberWP > 0)
      disp_message (WindowHandle, NumberWP, ‘window’, 10 + 25, 10 + 180, ‘red’, ‘true’)
      endif
      disp_message (WindowHandle, '# missing pills: ’ + NumberMP, ‘window’, 10 + 50, 10, ‘black’, ‘true’)
      if (NumberMP > 0)
      disp_message (WindowHandle, NumberMP, ‘window’, 10 + 50, 10 + 180, ‘red’, ‘true’)
      endif
      dev_set_color (‘red’)
      dev_display (WrongPill)
      dev_display (MissingPill)
      if (Index < Count)
      disp_continue_message (WindowHandle, ‘black’, ‘true’)
      endif
      stop ()
      endfor

处理思路

在这个例子是药品行业胶囊的检测,是比较经典的例子,我们下一篇文章介绍另一个胶囊检测例子。这个胶囊检测首先用到了仿射变换,把每个胶囊的单元提取出来,然后使用最简单的blob分析对缺陷进行提取。

后记

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

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

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

相关文章

【机器学习实战】——常见函数积累

目录 第二章 k近邻算法 1、array.sum(axies 1) : 2、array.argsort(axies0/1) 3、array.tile(mat,(m,n)) 4、dict.get(key,value) 5、sorted函数 6、string.strip()函数 7、string.split() 8、scatter&#xff08;&#xff09;函数 9、min()&max() 10、enumera…

安装oracle 11g 客户端,检查过程中报物理内存不足的解决

今早接到同事电话&#xff0c;说安装oracle 11g客户端的时候&#xff0c;在检查先决条件的时候&#xff0c;报错&#xff0c;说内存不足&#xff0c;但是本机的内存是2G&#xff0c;肯定够用&#xff1a;如图&#xff1a; 找了一圈&#xff0c;原来Oracle执行先决条件检查是依赖…

智能时代 软件赋能——2017中国软件技术大会

由中国科学院软件研究所、中科软科技股份有限公司联合主办&#xff0c;北京中科凯亚科技有限公司协办的第15届中国软件技术大会将于2017年12月在北京 国家会议中心隆重举行。 毋庸置疑&#xff0c;我们正在迈入智能时代&#xff0c;伴随着物联网、云计算、大数据、人工智能等智…

Arduino 代码机制

新建一个Arduino程序。可是建完就郁闷了&#xff0c;因为只看到了setup和loop函数&#xff0c;却没有基本的c函数。 void setup() {// put your setup code here, to run once: }void loop() {// put your main code here, to run repeatedly: }于是好奇心就来了&#xff0c;当…

Codeforces Round #401 (Div. 2) D. Cloud of Hashtags

题目链接&#xff1a;D. Cloud of Hashtags 题意&#xff1a; 给你n个字符串&#xff0c;让你删后缀&#xff0c;使得这些字符串按字典序排列&#xff0c;要求是删除的后缀最少 题解&#xff1a; 由于n比较大&#xff0c;我们可以将全部的字符串存在一个数组里面&#xff0c;然…

HALCON示例程序check_blister_mixed.hedv药品胶囊缺陷检测

HALCON示例程序check_blister_mixed.hedv药品胶囊缺陷检测 示例程序源码&#xff08;加注释&#xff09; 读入图片与显示相关设置 dev_close_window () read_image (Image, ‘blister/blister_mixed_reference’) dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHan…

php类与对象

1.类与对象 对象&#xff1a;实际存在该类事物中每个实物的个体。$a new User(); 实例化后的$a 引用&#xff1a;php的别名&#xff0c;两个不同的变量名字指向相同的内容 封装: 把对象的属性和方法组织在一个类&#xff08;逻辑单元&#xff09;里 继承&#xff1a;以原有的类…

【深度学习系列】基础知识、模型学习

基础知识 原创 【深度学习】——训练过程 原创 【深度学习】——BN层&#xff08;batch normalization&#xff09; 原创 【深度学习】——激活函数&#xff08;sigmoid、tanh、relu、softmax&#xff09; 原创 【深度学习】——损失函数 原创 【深度学习】——梯度下…

史陶比尔机器人的 LLI (Low Level Interface)

史陶比尔机器人的 LLI &#xff08;Low Level Interface&#xff09; 史陶比尔机器人拥有 Low Level Interface (LLI)接口选项. 在CS8C控制器的时代&#xff0c;LLI 接口仍然可用。这是一个选项接口。.这是除了VAL3编程语言之外的替代操作系统。通过C程序替代你的程序。 这里的…

阳狮集团与阿里巴巴全域营销伙伴关系再升级:数据和业务合作将更紧密

3月6日&#xff0c;阿里巴巴集团与全球领先的广告传播集团阳狮集团在上海开启了主题为“新局面新高度”新阶段的合作沟通&#xff0c;未来双方将进行更紧密的数据和业务层面的合作。阿里巴巴集团CMO、阿里妈妈总裁董本洪及阳狮媒体大中华区首席执行官张敬鸾就开放共赢达成共识&…

HALCON示例程序check_bottle_crate.hdev啤酒箱内酒瓶数检测

HALCON示例程序check_bottle_crate.hdev啤酒箱内酒瓶数检测 示例程序源码&#xff08;加注释&#xff09; 获取系统关于“空白区域储存的设置” get_system (‘store_empty_region’, StoreEmptyRegion)系统“空白区域储存”设置为 ‘false’ set_system (‘store_empty_regi…

#undef 标识符

#undef 是在后面取消以前定义的宏定义 该指令的形式为 #undef 标识符 其中&#xff0c;标识符是一个宏名称。如果标识符当前没有被定义成一个宏名称&#xff0c;那么就会忽略该指令。一旦定义预处理器标识符&#xff0c;它将保持已定义状态且在作用域内&#xff0c;直到程序结束…

[转]OpenGL库介绍

原帖地址&#xff1a;http://blog.csdn.net/yyyuhan/archive/2008/01/15/2045009.aspx 开发基于OpenGL的应用程序&#xff0c;必须先了解OpenGL的库函数。它采用C语言风格&#xff0c;提供大量的函数来进行图形的处理和显示。OpenGL库函数的命名方式非常有规律。所有OpenGL函数…

SQL Server优化50法

查询速度慢的原因很多&#xff0c;常见如下几种&#xff1a; 1、没有索引或者没有用到索引(这是查询慢最常见的问题&#xff0c;是程序设计的缺陷) 2、I/O吞吐量小&#xff0c;形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 4、内存不足 5、网络速度慢 …

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

HALCON示例程序check_fish_stick_dimension.hdev基于形态学的像素级精度尺寸测量 示例程序源码&#xff08;加注释&#xff09; 关闭实时显示更新 dev_update_off () 关闭窗口 dev_close_window () 读入图片 read_image (Image, ‘food/fish_sticks_raw_01’) 根据给定长宽…

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

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

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;写…