Fork me on GitHub

至简

Be simple

为了寻找你,我把自己搬进鸟的眼睛,经常盯着路过的风。


工业视觉项目之二:3D图像模板匹配


写在前面

标题中虽然说是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内的处理方法,在此不一一赘述。