halcon 实现透明多边形ROI区域,并将ROI区域创建为模板,进行模板匹配。
前言
案例展示
核心内容
*1、halcon 实现透明多边形ROI区域 使用算子生成点
gen_circle (Point, Row, Column,PointSize)
*2、使用算子将点 连接成多边形区域。
gen_region_polygon (Region,Rows, Columns)
*3、填充生成的区域
fill_up (Region, RegionFillUp)
*4、先清空窗口,再设置透明填充
dev_clear_window ()
dev_display (Image)
dev_set_draw (‘fill’)
set_rgba (WindowHandle, 0, 0,255, 100)
disp_region (RegionFillUp, WindowHandle)
**5、裁剪模板图像
reduce_domain (Image, RegionFillUp, ModelImage)
*6、创建模板
create_shape_model (ModelImage, ‘auto’, -0.39, 0.79, ‘auto’, ‘auto’, ‘use_polarity’, ‘auto’, ‘auto’, ModelID)
**7、查找模板
find_shape_model (Image, ModelID, -0.39, 0.79, 0.5, 1, 0.5, ‘least_squares’, 0, 0.9, Row3, Column3, Angle, Score)
*8、获取模板轮廓
get_shape_model_contours (ModelContours, ModelID, 1)
*9、将模板映射到目标上
*根据匹配到的点和角度生成对应的2D矩阵
vector_angle_to_rigid (0, 0, 0, Row3, Column3, Angle, HomMat2D)
**使用仿射变换生成轮廓点,用于显示匹配到的轮廓
affine_trans_contour_xld (ModelContours, ContoursAffinTrans, HomMat2D)
完整代码
dev_clear_window ()
dev_close_window ()
*打开窗口
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*读取图像
read_image (Image, 'printer_chip/printer_chip_01')
*按钮值
Button :=0
*点大小
PointSize :=5
*点颜色
dev_set_color ('blue')
*创建数组存储点
Rows := []
Columns := []
Length :=1
while (Button!=4)
Row:=-1
Column :=-1
dev_set_check ('~give_error')
**等待按钮按下
get_mbutton (WindowHandle, Row, Column, Button)
dev_set_color('blue')
**获取鼠标位置及鼠标按钮状态
*get_mposition (WindowHandle, Row, Column, Button)
dev_set_check ('give_error')
if (Button==1)
gen_circle (Point, Row, Column, PointSize)
Rows:=[Rows,Row]
Columns:=[Columns,Column]
*生成连接线
gen_region_polygon (Region,Rows, Columns)
endif
*绘制的点必须大于2,否则无法重合区域
if (Button==4 and |Rows|<3)
Button :=0
* 设置字体颜色和大小
dev_set_color('red')
set_display_font (WindowHandle, 12, 'mono', 'true', 'false')
* 在指定区域内写入字符串
content := 'The number of points is less than 2. Please Continue draw!'
disp_message(WindowHandle, content, 'window', 0 + 10, 0 + 10, 'red', 'true')
stop ()
endif
endwhile
*第一个点跟最后一个点为同一个点,形成闭合区域
Region_Rows:=[Rows,Rows[0]]
Region_Columns:=[Columns,Columns[0]]
dev_set_draw ('fill')
*生成区域
gen_region_polygon (Region,Region_Rows, Region_Columns)
*生成填充区域
fill_up (Region, RegionFillUp)
dev_clear_window ()
dev_display (Image)
dev_set_draw ('fill')
set_rgba (WindowHandle, 0, 0,255, 100)
disp_region (RegionFillUp, WindowHandle)
stop ()
****************************************************************************************************
**裁剪模板图像
reduce_domain (Image, RegionFillUp, ModelImage)
*创建模板
create_shape_model (ModelImage, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
**查找模板
find_shape_model (Image, ModelID, -0.39, 0.79, 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)