写在前面
标题中虽然说是3D
图像的模板匹配,其实本篇内容的实质仍是2D
,因为我所叙述的项目中的3D
图像格式为tif
,处理逻辑跟单通道灰度图是一致的,只不过这些值不是灰度值,而是深度信息。
比如下面一幅图,是锂电行业某公司产线上的焊后3D
成像,在这里模板匹配主要解决的是观察孔的定位(红色框中)。
模板生成
read_image (Image, './1634208093_4_3D_origin.tif')
* 1. Build the ROI from basic regions
gen_circle (ModelRegion, 262.376, 772.483, 43.5028)
gen_circle (_TmpRegion, 262.028, 773.548, 31.1812)
difference (ModelRegion, _TmpRegion, ModelRegion)
* 2. Reduce the model template
reduce_domain (Image, ModelRegion, TemplateImage)
* 3. Create the shape model
create_shape_model (TemplateImage, 3, rad(0), rad(180), rad(2.967), ['point_reduction_low','no_pregeneration'], 'use_polarity', [24832,29205,11], 13380, ModelID)
* 4. Save the shape model
write_shape_model (ModelID,'./regionCircle3D.shm')
原图请点击:1634208093_4_3D_origin.tif
有关create_shape_model
算子更多参数内容请参考Halcon
官网的这里。
模板使用
read_shape_model ('./regionCircle3D.shm', ModelID)
* 1. Get the model contour for transforming it later into the image
get_shape_model_contours (ModelContours, ModelID, 1)
read_image (Image, './test3dModel.tif')
* 2. Find the model
find_shape_model (Image, ModelID, rad(0), rad(180), 0.5, 2, 0.5, ['interpolation','max_deformation 10'], [3,1], 0.75, Row, Column, Angle, Score)
* 3. Transform the model contours into the detected positions
if (|Score|>0)
for I := 0 to |Score| - 1 by 1
hom_mat2d_identity (HomMat2D)
hom_mat2d_rotate (HomMat2D, Angle[I], 0, 0, HomMat2D)
hom_mat2d_translate (HomMat2D, Row[I], Column[I], HomMat2D)
affine_trans_contour_xld (ModelContours, TransContours, HomMat2D)
dev_set_color ('green')
dev_display (TransContours)
stop ()
endfor
else
* do sth.
endif
测试图片请点击:test3dModel.tif
有关find_shape_model
算子的更多参数内容请参考Halcon
官网的这里。
在实际工业场景中,为了保证算法的稳定性,通常要加很多规则,体现在上面代码的话就是else
内的处理方法,在此不一一赘述。