1、例程介绍

本例程次要展现了Halcon实现胶囊药丸的自动检测,目标是检测主动封装的药丸是否有漏装和错装。第一张图像作为参考图像,用来定位后续图像的胶囊的胶囊仓。用Blob剖析宰割的药丸并对进行分类这个实例中,用的最要害的货色是基于灰度的辨认,操作。

次要算子:
仿射变换算子 :vector_angle_to_rigid,affine_trans_image
形态学算子 :closing_rectangle1,opening_circle,shape_trans

2、例程解析

* 敞开窗体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 ('fill')*设置线宽dev_set_line_width (3)*获取图像中的通道一的图像access_channel (ImageOrig, Image1, 1)*阈值宰割threshold (Image1, Region, 90, 255)*变换形态,整体变凸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)*仿射变换图像到参考图像affine_trans_image (ImageOrig, Image2, HomMat2D, 'constant', 'false')*生成空对象gen_empty_obj (Chambers)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)        *联结矩形(union是合几为一,原来的对象没有了。concat只是组成一个汇合,原                *来的对象还按程序放着)        concat_obj (Chambers, Rectangle, Chambers)    endforendfor*仿射变换区域到参考区域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)stop ()* 每一张读取到的图像都要向参考图像对齐,截取感兴趣区域Count := 6for 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')        * Segment pills 宰割药片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')    endif    stop ()endfor

3、例程配图

图一为模板图像和阈值和形态学分隔后的胶囊感兴趣区域

图二为理论检测图像成果