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

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

示例程序源码(加注释)

  • 读入图片与显示相关设置
    dev_close_window ()
    read_image (Image, ‘blister/blister_mixed_reference’)
    dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
    set_display_font (WindowHandle, 14, ‘mono’, ‘true’, ‘false’)
    dev_update_off ()
    dev_display (Image)
    dev_set_draw (‘margin’)
  • 首先提取每个胶囊
    disp_message (WindowHandle, ‘Train gmm classifier on pill types’, ‘window’, -1, -1, ‘black’, ‘true’)
  • 注意注意敲黑板,划重点。下边的这个函数是halcon函数的封装,里边代码有好多。内容是上一篇文章介绍过,大同小异,所以不理解的话看一下上一篇例子。下边的代码块是extract_pill_types里边的内容。
    extract_pill_types (Image, Chambers, ChambersUnion, Classes, PhiRef, RowRef, ColumnRef, PillTypeCount)
threshold (Image, Region, 90, 255)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5000, 999999)
shape_trans (SelectedRegions, Blister, 'convex')
gen_empty_region (Chambers)
for I := 0 to 4 by 1Row := 107 + I * 70for J := 0 to 2 by 1Column := 177 + J * 150gen_rectangle2 (Rectangle, Row, Column, 0, 64, 30)concat_obj (Chambers, Rectangle, Chambers)endfor
endfor
difference (Blister, Chambers, Pattern)
union1 (Chambers, ChambersUnion)
orientation_region (Blister, PhiRef)
PhiRef := rad(180) + PhiRef
area_center (Blister, Area, RowRef, ColumnRef)*  +++ Extract pattern for classification +++
select_shape (Chambers, PillType1, 'row', 'and', 1, 145)
union1 (PillType1, PillType1)
select_shape (Chambers, PillType2, 'row', 'and', 145, 270)
union1 (PillType2, PillType2)
select_shape (Chambers, PillType3, 'row', 'and', 270, 390)
union1 (PillType3, PillType3)* Extract color space of yellow pills
reduce_domain (Image, PillType1, ImageReduced)
decompose3 (ImageReduced, ImageR, ImageG, ImageB)
threshold (ImageB, Region, 60, 95)* Extract color space of red pills
reduce_domain (Image, PillType2, ImageReduced)
decompose3 (ImageReduced, ImageR, ImageG, ImageB)
* invert_image反转图像的灰度值
invert_image (ImageB, ImageInvert)
* hysteresis_threshold使用迟滞阈值操作
* 函数原型:hysteresis_threshold(Image : RegionHysteresis : Low, High, MaxLength : )
* Image :输入图像;RegionHysteresis :输出区域;Low:低于这个灰度不会被选中;High:高于这个灰度立刻被选中;
* MaxLength :在Low与High之间的根据MaxLength 对比度进行选择,和carry边缘类似。
hysteresis_threshold (ImageInvert, RegionHysteresis2, 190, 200, 5)* Extract color space of green pills
reduce_domain (Image, PillType3, ImageReduced)
decompose3 (ImageReduced, ImageR, ImageG, ImageB)
invert_image (ImageB, ImageInvert)
hysteresis_threshold (ImageInvert, RegionHysteresis3, 180, 200, 10)* 求两个区域的交集
intersection (Region, PillType1, PillType1)
intersection (RegionHysteresis2, PillType2, PillType2)
PillTypeCount := [3,6,6]
intersection (RegionHysteresis3, PillType3, PillType3)
concat_obj (PillType1, PillType2, Classes)
concat_obj (Classes, PillType3, Classes)
return ()

NumClasses := |PillTypeCount|

  • 创建创建高斯混合模型

  • 输入参数: NumDim:几个特征;NumClasses:样本分类个数;NumCenters:类中心的个数;CovarType:

  • 协方差矩阵(‘Spherical’,‘diag’,‘full’);Preprocessing:预处理是否使用,及特征向量转换类型;

  • NumComponents:预处理参数,转换特征数;RandSend:迭代次数,初始化GMM;

  • 输出参数:GMMHandle:高斯混合模型
    create_class_gmm (3, 3, [1,5], ‘spherical’, ‘normalization’, 10, 42, GMMHandle)

  • 含义:增加训练样本(图片区),放入GMM 进行训练数据

  • 输入参数:Image:训练的图像(多通道);ClassRegions:图像中用于训练的类区域;

  • GMMHandle:高斯混合模型;Randomize:高斯噪声标准差
    add_samples_image_class_gmm (Image, Classes, GMMHandle, 0)

  • 含义:训练高斯混合模型

  • 输入参数:GMMHandle:高斯混合模型;MixIter: 期望最大值算法中迭代最大数;

  • Threshold:期望误差阈值,超过此值,计算取消;

  • ClassPriors:类的先验概率类型;(‘training’,‘uniform’)'uniform’表示使用相同的权重,1/NumClasses;'training’表示类发生的概率是依据样本中的概率推断。

  • Regularize:调整值,为了防止计算中出现奇异协方差矩阵。增加到协方差矩阵的对角线上的一个很小的值

  • 输出参数:Centers:每个类的中心个数

  • Iter:每个类的迭代次数
    train_class_gmm (GMMHandle, 100, 0.001, ‘training’, 0.0001, Centers, Iter)

  • 检测胶囊
    Count := 12
    for FileIndex := 1 to Count by 1

    • 读入图片
      read_image (Image, ‘blister/blister_mixed_’ + FileIndex$‘02’)
    • 阈值分割
      threshold (Image, Region, 90, 255)
    • 分割连通域
      connection (Region, ConnectedRegions)
    • 面积对区域筛选
      select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 5000, 9999999)
    • 求取最大区域边缘
      shape_trans (SelectedRegions, RegionTrans, ‘convex’)
    • 利用椭圆变换,得出区域角度
      orientation_region (RegionTrans, Phi)
      if (abs(Phi) > rad(90))
      Phi := rad(180) + Phi
      endif
    • 求取区域面积与中心坐标
      area_center (RegionTrans, Area1, Row, Column)
    • 创建平移旋转变换矩阵
      vector_angle_to_rigid (Row, Column, Phi, RowRef, ColumnRef, PhiRef, HomMat2D)
    • 使用仿射变换矩阵进行任意仿射变换
      affine_trans_image (Image, ImageAffinTrans, HomMat2D, ‘constant’, ‘false’)
    • 减少图像定义域
      reduce_domain (ImageAffinTrans, ChambersUnion, ImageReduced)
    • 将图片分为rgb三通道图像
      decompose3 (ImageAffinTrans, ImageR, ImageG, ImageB)
    • 对每个胶囊进行识别检测
    • 含义:使用GMM分类一个图像
    • 输入参数:Image:训练的图像(多通道);GMMHandle:GMM模型;
    • RejectionThreshold:分类拒绝阈值,如果图像所有的像素概率低于此值将不会分类任何类。
    • 输出参数:ClassRegions:分类的各个区域
      classify_image_class_gmm (ImageReduced, ClassRegions, GMMHandle, 0.005)
    • 对ClassRegions进行计数
      count_obj (ClassRegions, Number)
    • 生成空区域
      gen_empty_obj (FinalClasses)
    • 分割连通域
      connection (Chambers, ChambersRemaining)
      for Index := Number to 1 by -1
      dev_clear_window ()
      • 选择ClassRegions区域中的第Index个对象
        select_obj (ClassRegions, Region, Index)
      • 求交集
        intersection (ChambersRemaining, Region, Region)
      • 使用面积与宽度进行区域筛选
        select_shape (Region, PillsOfOneType, [‘area’,‘width’], ‘and’, [200,40], [3000,68])
      • 求取两个区域的差集
        difference (ChambersUnion, PillsOfOneType, RegionDifference)
      • 分割连通域
        connection (RegionDifference, ConnectedRegions)
      • 使用面积进行区域筛选
        select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 0, 7868)
      • 求取区域的最大边缘
        shape_trans (SelectedRegions, SelectedRegions, ‘convex’)
      • 联合区域
        union1 (SelectedRegions, SelectedRegions)
      • 求取区域差集
        difference (ChambersRemaining, SelectedRegions, ChambersRemaining)
      • 联合两个区域
        concat_obj (SelectedRegions, FinalClasses, FinalClasses)
        endfor
    • 得出结果进行处理得出结论
      gen_empty_obj (MissingPills)
      gen_empty_obj (WrongPills)
      gen_empty_obj (WrongNumberOfPills)
      difference (ChambersUnion, FinalClasses, LeftOvers)
      area_center (LeftOvers, Area, Row1, Column1)
      if (Area > 0)
      connection (LeftOvers, LeftOvers)
      count_obj (LeftOvers, Number)
      for Index := 1 to Number by 1
      select_obj (LeftOvers, ObjectSelected, Index)
      intensity (ObjectSelected, ImageB, Mean, Deviation)
      if (Deviation > 40)
      concat_obj (WrongPills, ObjectSelected, WrongPills)
      else
      concat_obj (MissingPills, ObjectSelected, MissingPills)
      endif
      endfor
      endif
    • Compute histogram
      CountFinalClass := []
      for Index := 1 to NumClasses by 1
      select_obj (FinalClasses, ObjectSelected, Index)
      connection (ObjectSelected, ObjectSelected)
      count_obj (ObjectSelected, Size)
      CountFinalClass := [CountFinalClass,Size]
      endfor
    • Display classification results and output allover statistic
      display_results (ImageAffinTrans, LeftOvers, FinalClasses, WrongPills, CountFinalClass, PillTypeCount, WindowHandle)
      if (FileIndex < Count)
      disp_continue_message (WindowHandle, ‘black’, ‘true’)
      endif
      stop ()
      endfor
  • Clear classifier handle
    clear_class_gmm (GMMHandle)

处理思路

此例子使用GMM高斯分类器进行胶囊识别识别,因为一版药上有多个种类的药片。

后记

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

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

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

相关文章

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

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;流程安装成功后即加入…