halcon 实现橡皮擦功能,透明橡皮擦涂抹,ROI区域、屏蔽区域:
最近学习halcon代码实现一些常用的视觉功能,如下代码实现了在halcon中实现橡皮擦功能,案例展示和代码如下:
案例展示
代码
dev_clear_window ()
dev_close_window ()
********************************屏蔽区域********************************
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
**读取图像
read_image (Image, 'printer_chip/printer_chip_01')
**备份复制图像
copy_image (Image, DupImage1)
**获取通道数,判断转换图像(1to3)
ImageRGB1 :=DupImage1
count_channels (DupImage1, Channels)
*获取原图3通道图像
if (Channels==1)
get_image_pointer1 (DupImage1, Pointer, Type, Width, Height)
gen_image3 (ImageRGB1, Type, Width, Height, Pointer, Pointer, Pointer)
endif
**备份复制彩色图像
copy_image (ImageRGB1, srcImageRGB)
**********************************橡皮擦**********************************
dev_clear_window ()
dev_display (DupImage1)
DupImage2:=Image
dev_set_draw ('margin')
copy_image (srcImageRGB, srcImageRGB2)
copy_image (srcImageRGB2, ImageRGB3)
**绘制并生成矩形
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle3, Row1, Column1, Row2, Column2)
**裁剪区域感兴趣区域
reduce_domain (DupImage2, Rectangle3, RoiRegion2)
**获取绘制了感兴趣区域的图像(透明色)
color := [0,0,255]
overpaint_region (ImageRGB3, Rectangle3, color, 'fill')
add_image (srcImageRGB, ImageRGB3, ImageResult1, 0.5, 0)
*stop ()
color := [255,0,0]
dev_set_color ('red')
EraserSize:= 100
Button :=0
gen_empty_obj (EraserRegion)
gen_empty_region (Region_Removeds)
*dev_set_draw ('fill')
copy_image (ImageRGB3, ImageRGB4)
dev_display (ImageResult1)
while (Button!=4)
Row := -1
Column := -1
dev_set_check ('~give_error')
get_mposition (WindowHandle, Row, Column, Button)
dev_set_check ('give_error')
if (Button==1)
*生成橡皮擦擦过的区域
gen_circle (EraserRegion, Row, Column, EraserSize)
union2(Region_Removeds,EraserRegion,Region_Removeds)
**获取绘制了感兴趣区域、屏蔽区域的图像(透明色)
overpaint_region (ImageRGB4, Region_Removeds, color, 'fill')
add_image (srcImageRGB2, ImageRGB4, ImageResult3, 0.5, 0)
dev_display (ImageResult3)
endif
*flush_buffer (WindowHandle)
endwhile
**图像相减,得到不同的区域:
difference (RoiRegion2, Region_Removeds, RegionDifference2)
**获取模板图像
reduce_domain (RoiRegion2, RegionDifference2, ImageReduced2)
**创建模板**********
create_shape_model (ImageReduced2, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
find_shape_model (Image, ModelID, rad(-180), rad(180), 0.5, 1, 0.5, 'least_squares', 0, 0.9, \
Row3, Column3, Angle, Score)
*获取模板轮廓
get_shape_model_contours (ModelContours, ModelID, 1)
dev_set_color ('green')
dev_clear_window ()
dev_display (Image)
dev_set_line_width (2)
*将模板映射到目标上
vector_angle_to_rigid (0, 0, 0, Row3, Column3, Angle, HomMat2D)
affine_trans_contour_xld (ModelContours, ContoursAffinTrans, HomMat2D)
总结
代码存在一些瑕疵,涂抹时会闪烁,暂时不准备优化,后期用C#实现应该没这种情况。