一、简介
图像拼接是我们常用到的一种技术,我个人曾经天真的以为项目中最长用的是用halcon 案例中的那种来拼图,但是真正做项目的时候并不是这样的,这是项目中的一个一个真实案例。
二、项目背景
1、有 上、中、下三张图片,且每张图片的右边是一排标定圆
2、上面图的标定圆能拍到9个圆孔,中间的图片拍到上图的全部和下图的部分保证有重叠的,下图和中图肯定也要有重叠,如下图:
三、拼图原理
如前面两步所示:
第一步:我们需要找到图片右边的标定圆,找圆的时候,a、先通过blob 分析找出想要的圆孔的轮廓,然后拟合圆,还有一种方法就是计算出圆孔的area_center,然后用二维测量卡尺来拟合圆
* 通过面积来计算半径
Radius:=pow(mean(Area)/rad(180),0.5)
* 创建卡尺的
create_metrology_model (MetrologyHandle)
get_image_size (ImageReduced, Width, Height)
set_metrology_model_image_size (MetrologyHandle, Width, Height)
tuple_gen_const (|Row|, Radius, Radiuses)
add_metrology_object_circle_measure (MetrologyHandle, Row, Column, Radiuses, 5, 10, 1, 30, ['num_measures','measure_transition','measure_select','min_score'], [16,'positive','all',0.1], Index_circle)
apply_metrology_model (ImageReduced, MetrologyHandle)
get_metrology_object_result (MetrologyHandle, Index_circle, 'all', 'result_type', 'all_param', Parameter_circle)
第二步:第一步中我们得到的各个图片的圆孔行列坐标,这一步只要是计算重叠位置的差,分布是上图和中图 的offsetx1 offsety1,以及中图和下图的offsetx2,offsety2 。计算的方式有很多,这里就不说了。
第三步:通过tile_images_offset 算子来拼图
四、显示效果
核心代码:
找圆
* 得到9个圆的半径和 行列坐标
Albert_Carib_Circle (ImageResult, ContCircleT, 'TOP', tilParams[6], [tilParams[7],tilParams[9],tilParams[10]], [tilParams[8],1,tilParams[11]], [], ProcessObjOut, ProcessObjOut, RowT, ColumnT)
SetDictObject (ContCircleT, ProcessObjOut, '上图找圆结果')
* 计算相邻两个圆之间的距离
distance_pp (RowT[0:|RowT|-2], ColumnT[0:|RowT|-2], RowT[1:|RowT|-1], ColumnT[1:|RowT|-1], Distance)
a := max(Distance)-min(Distance)
拼图:
OffsetYX := [0,0,OffsetY11,OffsetX11,OffsetY11+OffsetY22,OffsetX11+OffsetX22]
* set_dict_tuple (DictHandle_tile, '标定圆提取', ProcessObjOut)
*拼图
gen_empty_obj (TiledImageLight)
gen_empty_obj (TiledImageDark)
get_image_size (ObjectSelected, Width, Height)
tile_images_offset (ImageLights, TiledImageLight, [OffsetYX[0],OffsetYX[2],OffsetYX[4]], [OffsetYX[1],OffsetYX[3],OffsetYX[5]], [0,0,0], [0,0,0], [Height,Height,Height], [Width,Width,Width], Width, Height*3-2000)
最终效果: