halcon实例学习-检测药片完整性

halcon官方实例翻译,由于不太明白halcon的算子和函数的用途和含义,于是学习几篇官方实例,翻译一下,方便阅读

此实例为   定位/check_blister.hdev  

检查自动填充的水泡内容是否完整

 

* This example demonstrates an application from the pharmaceutical
* industry. The task is to check the content of automatically filled
* blisters. The first image (reference) is used to locate the chambers
* within a blister shape as a reference model, which is then used to
* realign the subsequent images along to this reference shape. Using
* blob analysis the content of each chamber is segmented and finally
* classified by a few shape features.
* 
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 (ImageOrig, Image1, 1) //从多通道图像获取但通道
threshold (Image1, Region, 90, 255) //用临界值获取一个区域Region
shape_trans (Region, Blister, 'convex') //把给定的区域根据给定类型转变为形状
orientation_region (Blister, Phi) //计算区域的方向
area_center (Blister, Area1, Row, Column) //获取该区域的面积和位置
vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)//由一个旋转和一个平移组成的变换,从一个点对应和两个对应的角度返回,作为齐次变换矩阵HomMat2D
affine_trans_image (ImageOrig, Image2, HomMat2D, 'constant', 'false') //对图像应用任意的仿射二维变换。
gen_empty_obj (Chambers) //创建一个空的tuple类型
for I := 0 to 4 by 1
    Row := 88 + I * 70
    for J := 0 to 2 by 1
        Column := 163 + J * 150
        gen_rectangle2 (Rectangle, Row, Column, 0, 64, 30)  //创建一个矩形
        concat_obj (Chambers, Rectangle, Chambers) //连接两个图标对象元组。
    endfor
endfor
affine_trans_region (Blister, Blister, HomMat2D, 'nearest_neighbor')//应用一个任意的二维仿射变换到区域。
difference (Blister, Chambers, Pattern) //计算两个区域的差值。
union1 (Chambers, ChambersUnion) //返回所有输入区域的并集。
orientation_region (Blister, PhiRef)//计算区域的方向
PhiRef := rad(180) + PhiRef
area_center (Blister, Area2, RowRef, ColumnRef)//取区域的面积和位置
* 
* 
* 读取的每张图像都将与此模式对齐,并缩小到感兴趣的区域,即水泡的腔室
Count := 6
for Index := 1 to Count by 1
    read_image (Image, 'blister/blister_' + Index$'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)//计算区域方向
    area_center (RegionTrans, Area3, Row, Column)//获取区域面积和位置
    vector_angle_to_rigid (Row, Column, Phi, RowRef, ColumnRef, PhiRef, HomMat2D)//从点和角度计算刚性仿射变换。
    affine_trans_image (Image, ImageAffineTrans, HomMat2D, 'constant', 'false')//对图像应用任意的仿射二维变换。
    * 
    * 段药片
    reduce_domain (ImageAffineTrans, ChambersUnion, ImageReduced)//缩小图像的域。
    decompose3 (ImageReduced, ImageR, ImageG, ImageB)//转换一个三通道图像成三个图像。
    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')//将形状转换为区域
    * 
    * 对分割结果进行分类并统计显示
    count_obj (Chambers, Number)//获取对象数量
    gen_empty_obj (WrongPill)//创建一个空的元祖
    gen_empty_obj (MissingPill)//创建一个空的元祖
    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 (ImageAffineTrans) //展示图像
    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', 12, 12 + 600, 'red', 'true')//输入文字到指定位置
    else
        disp_message (WindowHandle, 'OK', 'window', 12, 12 + 600, 'forest green', 'true')
    endif
    * 
    Message := '# Correct pills: ' + (NumberP - NumberWP)
    Message[1] := '# Wrong pills  :  ' + NumberWP
    Message[2] := '# Missing pills:  ' + NumberMP
    * 
    Colors := gen_tuple_const(3,'black')
    if (NumberWP > 0)
        Colors[1] := 'red'
    endif
    if (NumberMP > 0)
        Colors[2] := 'red'
    endif
    disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')//输入文字到指定位置
    dev_set_color ('red')//设置颜色
    dev_display (WrongPill)
    dev_display (MissingPill)
    if (Index < Count)
        disp_continue_message (WindowHandle, 'black', 'true')//此过程将在屏幕右下角显示“单击”Run“继续”。
    endif
    stop ()
endfor

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值