1、例程介绍本例程次要展现了Halcon实现胶囊药丸的自动检测,目标是检测主动封装的药丸是否有漏装和错装。第一张图像作为参考图像,用来定位后续图像的胶囊的胶囊仓。用Blob剖析宰割的药丸并对进行分类这个实例中,用的最要害的货色是基于灰度的辨认,操作。
次要算子:仿射变换算子 :vector_angle_to_rigid,affine_trans_image形态学算子 :closing_rectangle1,opening_circle,shape_trans2、例程解析* 敞开窗体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 ()endfor3、例程配图图一为模板图像和阈值和形态学分隔后的胶囊感兴趣区域图二为理论检测图像成果
...