Halcon模板匹配学习:create_average_shape_model
*此示例演示了如何从一组样本中创建模型以实现更高的鲁棒性。 这个想法是从给定对象的一组样本中创建一个平均图像,以平均化诸如表面纹理、形状或大小变化之类的干扰因素。
*为了执行此操作,首先需要对齐样品。 在该特定示例中,采样对识别和配准通过基于对象几何先验知识人造模型形状的匹配
(粉色是与dev_相关函数,与窗口和图像的显示、设置有关,绿色_model是模型的构建、寻找有关)
dev_update_off ()//一般dev_update_off放在开始,dev_update_on放在程序结束
dev_close_window ()//关闭活动图形窗口
read_image (Image, 'smd/smd_samples')//读图Image,路径‘smd/smd_samples’
get_image_size (Image, Width, Height)//获得图像的大小
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)//打开读入图像大小的活动图形窗口,窗口句柄WindowHandle
dev_display (Image)//显示图像
dev_set_line_width (2)//设置区域轮廓的线宽
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')//设置窗口字体属性,窗口句柄WindowHandle,size=14,Font=momo,bold是否加粗=true,slant是否斜体=flase
* 参数MinScore设置的越大,搜索的就越快。如果模板在图像中没有被遮挡,MinScore可以设置为0.8,甚至为0.9
MinScore1 := 0.65
MinScore2 := 0.8
create_reference_image (ReducedReferenceImage)//库里面自带的模型调用
*
area_center (ReducedReferenceImage, Area, RowRef, ColumnRef)//测得ReducedReferenceImage区域的面积(像素个数)和中心位置(坐标平均值)
get_image_size (ReducedReferenceImage, RefImgWidth, RefImgHeight)
dev_open_window (0, Width + 12, 3 * RefImgWidth, 3 * RefImgHeight, 'black', WindowHandleAvg)
set_display_font (WindowHandleAvg, 14, 'mono', 'true', 'false')
dev_display (ReducedReferenceImage)
disp_message (WindowHandleAvg, '1. Search artificial model', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandleAvg, 'black', 'true')//图像显示“Press Run (F5)to continue”
stop ()
*目前显示:
* Search artificial model in image with set of sample objects 使用一组样本对象在图像中搜索人工模型
create_scaled_shape_model (ReducedReferenceImage, 0, rad(-1), rad(2), 0, 0.77, 0.78, 0, 'point_reduction_low', 'use_polarity', 30, 3, ModelID)//创建模板模型
get_shape_model_params (ModelID, NumLevels, AngleStart, AngleExtent, AngleStep, ScaleMin, ScaleMax, ScaleStep, Metric, MinContrast)//得到模板模型
find_scaled_shape_model (Image, ModelID, rad(0), rad(180), 0.77, 0.78, MinScore1, 0, 0, 'interpolation', 2, 0.7, Row, Column, Angle, Scale, Score)//寻找模板模型
*
dev_set_window (WindowHandle)//**一个图形窗口
dev_display (Image)
dev_set_color ('green')//设置一个或多个输出颜色
dev_display_shape_matching_results (ModelID, 'green', Row, Column, Angle, Scale, Scale, 0)//显示匹配结果
disp_message (WindowHandle, 'MinScore: ' + MinScore1, 'window', 12, 12, 'black', 'true')//显示 'MinScore: ' + MinScore1
stop ()
*
* Average over all matches and calculate the average image 在所有匹配中取平均值并计算平均图像
dev_set_window (WindowHandleAvg)//**一个图形窗口
dev_set_line_width (2)
get_shape_model_contours (ModelContours, ModelID, 1)//返回形状模型ModelID表示形式,作为ModelContours中的XLD轮廓线
gen_empty_obj (Templates)// Create an empty object tuple 创建一个空数组
for K := 0 to |Row| - 1 by 1
vector_angle_to_rigid (RowRef, ColumnRef, 0, Row[K], Column[K], Angle[K], HomMat2DTranslate)//从点和角度计算刚性仿射变换。
hom_mat2d_scale (HomMat2DTranslate, Scale[K], Scale[K], Row[K], Column[K], HomMat2DScale)//将缩放比例添加到齐次的2D转换矩阵。
hom_mat2d_invert (HomMat2DScale, HomMat2DInvert)//hom_mat2d_invert反转HomMat2D给出的齐次2D转换矩阵。 结果矩阵在HomMat2DInvert中返回。
affine_trans_image (Image, ImageAffineTrans, HomMat2DInvert, 'constant', 'false')//将任意仿射2D变换(即缩放,旋转,平移和倾斜(倾斜))应用于Image中给出的图像,并在ImageAffineTrans中返回变换后的图像。
crop_rectangle1 (ImageAffineTrans, ImagePart, 0, 0, 80, 130)//切出一个或多个矩形图像区域。
concat_obj (Templates, ImagePart, Templates)//连接两个标志性对象元组。
*
dev_set_window (WindowHandle)
if (K > 0)
dev_display_shape_matching_results (ModelID, 'green', Row[K - 1], Column[K - 1], Angle[K - 1], Scale[K - 1], Scale[K - 1], 0)
endif
dev_display_shape_matching_results (ModelID, 'yellow', Row[K], Column[K], Angle[K], Scale[K], Scale[K], 0)
dev_set_window (WindowHandleAvg)
dev_display (ImagePart)
wait_seconds (0.2)
endfor
* Average template image
channels_to_image (Templates, MultiChannelImage)// 变换单通道图到多通道图
mean_n (MultiChannelImage, ImageMean)//多个通道上的平均灰度值
dev_set_window (WindowHandle)
dev_display_shape_matching_results (ModelID, 'green', Row[K - 1], Column[K - 1], Angle[K - 1], Scale[K - 1], Scale[K - 1], 0)
dev_set_window (WindowHandleAvg)
dev_display (ImageMean)
disp_message (WindowHandleAvg, 'Average object image', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandleAvg, 'black', 'true')
stop ()
*
* Use the average image to create a model that resembles more closely 使用平均图像创建更接近于smd实际外观的模型
* the actual appearance of the smd
create_scaled_shape_model (ImageMean, 0, rad(-1), rad(2), 0, 0.77, 0.78, 0, 'point_reduction_low', 'use_polarity', 45, 30, ModelIDAvg)
find_scaled_shape_model (Image, ModelIDAvg, rad(-1), rad(2), 0.77, 0.78, MinScore2, 0, 0, 'interpolation', 2, 0.5, Row, Column, Angle, Scale, Score)
*
dev_display (ImageMean)
disp_message (WindowHandleAvg, 'Resulting shape based model', 'window', 12, 12, 'black', 'true')
get_shape_model_contours (ModelContoursAvg, ModelIDAvg, 1)
area_center (ImageMean, Area1, Row1, Column1)
vector_angle_to_rigid (0, 0, 0, Row1, Column1, 0, HomMat2D)//从点和角度计算刚性仿射变换
affine_trans_contour_xld (ModelContoursAvg, ContoursAffineTrans, HomMat2D)//对XLD轮廓应用任意仿射2D变换。
dev_set_color ('yellow')
dev_display (ContoursAffineTrans)
disp_continue_message (WindowHandleAvg, 'black', 'true')
stop ()
*
dev_set_window_extents (-1, -1, Width, Height)
dev_display (Image)
dev_set_color ('green')
dev_display_shape_matching_results (ModelIDAvg, 'green', Row, Column, Angle, Scale, Scale, 0)
disp_message (WindowHandleAvg, 'MinScore: ' + MinScore2, 'window', 12, 12, 'black', 'true')
create_shape_model(
Template : : //reduce_domain后的模板图像
NumLevels,//金字塔的层数,可设为“auto”或0—10的整数
AngleStart,//模板旋转的起始角度
AngleExtent,//模板旋转角度范围, >=0
AngleStep,//旋转角度的步长, >=0 and <=pi/16
Optimization,//设置模板优化和模板创建方法
Metric, //匹配方法设置
Contrast,//设置对比度
MinContrast ://设置最小对比度
ModelID ) //输出模板句柄
find_shape_model(
const Hobject& Image, //搜索图像
Hlong ModelID, //模板句柄
Double AngleStart, // 搜索时的起始角度
Double AngleExtent, //搜索时的角度范围,必须与创建模板时的有交集。
Double MinScore, // 输出的匹配的质量系数Score 都得大于该值
Hlong NumMatches, // 定义要输出的匹配的最大个数
Double MaxOverlap, // 当找到的目标存在重叠时,且重叠大于该值时选择一个好的输出
const char* SubPixel, // 计算精度的设置,五种模式,多选2,3
Hlong NumLevels, // 搜索时金字塔的层数
Double Greediness , //贪婪度,搜索启发式,一般都设为0.9,越高速度快容易出现找不到的情况
Halcon::HTuple* Row, //输出匹配位置的行坐标
Halcon::HTuple* Column, //输出匹配位置的列坐标
Halcon::HTuple* Angle, //输出匹配角度
Halcon::HTuple* Score ) //输出匹配质量
模板建立参考:
Creat_average_shape_model.hdev例程相关学习(一)_人工智能_SRT字符不够的博客-****博客 https://blog.****.net/u013404374/article/details/46942397
find_shape_mode参数详解及时长优化:https://blog.****.net/u013698770/article/details/52198568
超级详细的create_shape_model和find_shape_model算子的详细讲解:https://blog.****.net/maweifei/article/details/78188993
affine_trans_image将任意仿射2D变换(即缩放,旋转,平移和倾斜(倾斜))应用于Image中给出的图像,并在ImageAffineTrans中返回变换后的图像。 仿射变换由HomMat2D中给出的齐次变换矩阵描述,该矩阵可以使用运算符hom_mat2d_identity,hom_mat2d_scale,hom_mat2d_rotate,hom_mat2d_translate等创建,也可以是vector_angle_to_rigid等运算符的结果。
放射变换参考:HALCON视觉算子2D/3DTransformations相关函数中文说明Tools(1)-代码狗 https://www.daimadog.com/3008.html
显示相关dev_参考:Halcon知识点随记(每日更新) - 杨萌珂 - 博客园 https://www.cnblogs.com/yangmengke2018/p/9630974.html
左图是采用库里面自带的图像建立的模板,MinScore=0.65
右图是采用多个对象建立的平均模板,MinScore=0.8
- 总结:采用多个对象建立的平均模板,具有更强的鲁棒性,克服因为纹理、大小以及形状变化产生的干扰
- 分析:模板采用的是正面图,没有歪斜,测试图片中的目标对象与模板对象相差无几,没有角度、大小的变化,过于理想。
- 实际应用可参考性:多个对象建立平均模板
- 后期:关于仿射变换没有弄懂,后期再更新。