工控编程吧
标题:
halcon gen_bundle_adjusted_mosaic相关函数介绍
[打印本页]
作者:
qq263946146
时间:
2019-5-27 22:50
标题:
halcon gen_bundle_adjusted_mosaic相关函数介绍
gen_bundle_adjusted_mosaic(Images : MosaicImage : HomMatrices2D, StackingOrder, TransformDomain : TransMat2D)
gen_bundle_adjusted_mosaic将图像Images组合成马赛克图像。
图像的相对位置由3x3投影变换矩阵定义。
数组HomMatrices2D包含这些线性化矩阵的序列。
转换矩阵可以用bundle_adjust_mosaic进行计算。
MosaicImage的原点及其大小被
自动选择
,使所有输入图像都完全可见。
将图像添加到马赛克中的顺序由StackingOrder给出。
这个数组中的第一个索引将位于图像堆栈的底部,而最后一个索引将位于顶部。
如果给定的是“default”而不是整数数组,则使用规范顺序(图像
Images
中使用的顺序)。
参数TransformDomain可以用来确定图像的域是否也被转换。
由于域的转换需要运行时间,因此应该使用这个参数来指定是否需要这样做。
如果将TransformDomain设置为“false”,则忽略输入图像的域,并转换完整的图像。
在输出时,TransMat2D参数包含一个3x3投影变换矩阵,
该矩阵描述了将所有图像完全转换为输出图像所需的平移。
参数
Images 输入的图像
MosaicImage输出的图像
HomMatrices2D输入的3x3投影变换矩阵
StackingOrder输入的
在马赛克中堆叠图像的顺序
TransformDomain是否
应该改变输入图像的域吗,有false,true值可选
1.
proj_match_points_ransac(Image1, Image2 : : Rows1, Cols1, Rows2, Cols2,
GrayMatchMethod, MaskSize, RowMove, ColMove, RowTolerance, ColTolerance, Rotation,
MatchThreshold, EstimationMethod, DistanceThreshold, RandSeed : HomMat2D, Points1, Points2)
函数给出输入图像Image1和Image2中特征点(Cols1,Rows1)和(Cols2,Rows2)的一组坐标,
proj_match_points_ransac自动确定对应的点,
并利用齐次投影变换矩阵HomMat2D将不同图像中的对应点最佳地相互转换。
例如,可以使用points_foerstner或points_harris提取特征点。
转换分两步确定:
首先,确定第一幅图像和第二幅图像中输入点周围掩模窗口的灰度值相关性,
利用两幅图像中窗口的相似性生成掩模窗口之间的初始匹配。
掩码窗口的大小为MaskSize x MaskSize。
可以选择三个相关指标。
如果GrayMatchMethod的值
为
‘ssd’,则使用灰度值差的平方和,
‘sad’表示绝对差的和,
‘ncc’表示归一化互相关。
详情请参考binocular_differences。
在所有可能的点对上最小化('ssd'、'sad')或最大化('ncc')。
因此,只有当度量值低于MatchThreshold值('ssd'、'sad')
或高于该值('ncc')时,才接受找到的匹配。
为了提高算法的性能,可以限制匹配的搜索区域。
只考虑2*RowTolerance*2*ColTolerance窗口内的点。
第二幅图像中搜索窗口中心相对于第一幅图像中当前点位置的偏移量由RowMove和ColMove给出。
如果转换包含旋转,即,如果第一幅图像相对于第二幅图像进行旋转,
则参数Rotation可以包含旋转角度的估计值或以弧度为单位的角度区间。
好的猜测可以提高灰度值匹配的质量。
如果实际旋转与指定的估计值相差太大,匹配通常会失败。
给定的区间越大,运算符的速度就越慢,因为整个算法会计算区间内的所有相关角度。
初始匹配完成后,使用随机搜索算法(RANSAC)确定转换矩阵HomMat2D。
它试图找到符合最大对应数的矩阵。
对于要接受的点,它到转换所预测坐标的距离必须不超过阈值 DistanceThreshold。
一旦做出选择,矩阵将使用所有一致的点进一步优化。
对于这种优化,可以选择估计方法作为缓慢但数学上最优的“gold_standard”方法
或更快的“normalized_dlt”方法。
这里使用了vector_to_proj_hom_mat2d算法。
仍然违反最终转换的一致性条件的点对将被删除,
匹配的点作为控制值返回。
Points1包含第一张图像中匹配的输入点的索引,
Points2包含第二张图像中对应点的索引。
参数RandSeed可用于控制RANSAC算法的随机性,从而获得可重复的结果。
如果将RandSeed设置为正数,则操作符在每次调用时都使用相同的参数生成相同的结果,
因为内部使用的随机数生成器是用seed值初始化的。
如果RandSeed = 0,则使用当前时间初始化随机数生成器。
因此,在这种情况下,结果可能无法重现。
参数:
Image1,Image2输入的两图像
Rows1,Cols1
图像1中特征点的行列坐标
Rows2,Cols2
图像2中特征点的行列坐标
GrayMatchMethod
灰度值比较度量。有
'ncc', 'sad', 'ssd'
MaskSize 灰度值掩码大小
RowMove,ColMove
平均行列坐标位移。
ColTolerance
匹配搜索窗口的半宽度。
Rotation旋转角度范围
MatchThreshold灰度值匹配阈值
EstimationMethod
变换矩阵估计算法。值有
'gold_standard', 'normalized_dlt'
RandSeed
为随机数生成器
种子
。
HomMat2D输出的
齐次射影变换矩阵。
Points1,Points2
图像1和2中匹配输入点的索引。
2.
bundle_adjust_mosaic( : : NumImages, ReferenceImage, MappingSource, MappingDest,
HomMatrices2D, Rows1, Cols1, Rows2, Cols2, NumCorrespondences, Transformation :
MosaicMatrices2D, Rows, Cols, Error)
bundle_adjust_mosaic执行图像马赛克的绑定调整。
这可以用来确定马赛克的几何形状尽可能鲁棒,
因此,确定转换的图像在马赛克比单一图像对更准确。
为了实现这一点,应该使用proj_match_points_ransac来确定马赛克中每个重叠图像对的投影变换。
例如,对于下面的一个2×2块图像的布局
1,2
3,4
确定如下射影变换,假设所有图像相互重叠:1->2,1->3,1->4,2->3,2->4和3->4。
由MappingSource和MappingDest给出了确定各自变换的图像索引。
指数从1开始。因此,在上面的示例中,
必须使用MappingSource =[1,1,1,2,2,3]和MappingDest =[2,3,4,3,4,4]。
马赛克中的图像数量由 NumImages给出。
它用于检查是否每个图像都可以通过一系列的变换得到。
参考图像的索引由ReferenceImage给出。
在输出时,这个图像以单位矩阵作为它的变换矩阵。
对应于图像对的3×3投影变换矩阵以 HomMatrices2D传递。
此外,图像对中匹配点对的坐标必须在Rows1、Cols1、Rows2和Cols2中传递。
可以使用tuple_select或HDevelop函数subset从proj_match_points_ransac的输出确定它们。
为了使bundle_adjust_mosaic能够确定哪个点对属于哪个图像对,
NumCorrespondences必须包含为每个图像对找到的匹配点的数量。
参数 Transformation确定在bundle调整中用于转换图像点的转换类。
这可以用来限制允许的转换。
对于 Transformation = 'projective',使用投射变换(参见vector_to_proj_hom_mat2d)。
对于 Transformation = 'affine',使用仿射变换(参见vector_to_hom_mat2d),
对于 Transformation = 'similarity',使用相似性变换(参见vector_to_similarity),
对于Transformation = 'rigid',使用刚性变换(参见vector_to_hard)。
结果束调整变换为一个3×3射影变换矩阵数组,保存于
MosaicMatrices2D
。
此外,通过bundle调整重构的点以(Rows, Cols)的形式返回。
重建点的平均投影误差保存于 Error。
这可以用来检查优化是否收敛到有用的值。
参数
NumImages
用于校准的不同图像的数量,要>=2.
ReferenceImage参考图像索引值
MappingSource
变换的源图像的索引。
MappingDest
变换的目标图像的索引。
HomMatrices2D
3×3射影变换矩阵的数组
Rows1,Cols1,Rows2,Cols2
对应源图像,目标图像中对应点的行列坐标。
NumCorrespondences
在各自的图像对中对应点的个数。
Transformation要使用的转换类型affine', 'projective', 'rigid', 'similarity'
MosaicMatrices2D输出的
由3×3投影变换矩阵组成的数组,用于确定图像在马赛克中的位置。
Rows,Cols
通过束平差重建各点的行列坐标。
Error
每个重建点的平均误差。
例程:
*例程实现将多张图片合并成一张大的马赛克图片。
*例程使用了proj_match_points_ransac,bundle_adjust_mosaic,gen_bundle_adjusted_mosaic
*展示了转换类别'projective', 'affine', 'similarity', and 'rigid'的效果
dev_close_window ()
dev_open_window (0, 0, 640, 480, 'white', WindowHandle1)
ImgPath := '3d_machine_vision/mosaic/'
ImgName := 'bga_r_'
*相机内参,用于消除径向畸变
gen_cam_par_area_scan_division (0.0121693, -2675.63, 7.40046e-006, 7.4e-006, 290.491, 258.887, 640, 480, CamParam)
change_radial_distortion_cam_par ('adaptive', CamParam, 0, CamParOut)
* 读取多张图片,逐一显示
gen_empty_obj (Images)
for J := 1 to 10 by 1
read_image (Image, ImgPath + ImgName + J$'02')
change_radial_distortion_image (Image, Image, Image, CamParam, CamParOut)
concat_obj (Images, Image, Images)
dev_clear_window ()
dev_display (Image)
wait_seconds (0.5)
endfor
stop ()
*为了显示匹配点(用于计算图像间的投影转换),我们会在一张大的拼接图像中显示全部小图像,图像间留一些空间,以便图像间边距可见
dev_set_window_extents (-1, -1, 3280 / 4, 980 / 4)
tile_images_offset (Images, TiledImage, [0,0,0,0,0,500,500,500,500,500], [0,660,1320,1980,2640,0,660,1320,1980,2640], [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1], [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1], [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1], [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1], 3280, 980)
dev_clear_window ()
dev_display (TiledImage)
stop ()
*计算每对图像间的匹配点及转换
dev_clear_window ()
dev_display (TiledImage)
disp_message (WindowHandle1, 'Point matches', 'window', 20, 10, 'green', 'false')
*定义图像对属性
From := [1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5]
To := [6,7,2,6,7,8,3,7,8,9,4,8,9,10,5,9,10]
Num := |From|
ProjMatrices := []
Rows1 := []
Cols1 := []
Rows2 := []
Cols2 := []
NumCorrespondences := []
for J := 0 to Num - 1 by 1
F := From[J]
T := To[J]
select_obj (Images, ImageF, F)
select_obj (Images, ImageT, T)
* Extract the points in both images.
SigmaGrad := 1
SigmaSmooth := 3
Alpha := 0.04
Threshold := 0
points_harris (ImageF, SigmaGrad, SigmaSmooth, Alpha, Threshold, RowFAll, ColFAll)
points_harris (ImageT, SigmaGrad, SigmaSmooth, Alpha, Threshold, RowTAll, ColTAll)
*为搜索窗口的位置定义初始值
if (F > 5)
FShiftR := 500
FShiftC := (F - 6) * 660
else
FShiftR := 0
FShiftC := (F - 1) * 660
endif
if (T > 5)
TShiftR := 500
TShiftC := (T - 6) * 660
else
TShiftR := 0
TShiftC := (T - 1) * 660
endif
RowMove := (FShiftR - TShiftR) / 2.7
ColMove := (FShiftC - TShiftC) / 2
* 执行匹配
MaskSize := 21
RowTolerance := 20
ColTolerance := 20
Rotation := 0
MatchThreshold := 50
DistanceThreshold := 0.4
RandSeed := 4364537
proj_match_points_ransac (ImageF, ImageT, RowFAll, ColFAll, RowTAll, ColTAll, 'sad', MaskSize, RowMove, ColMove, RowTolerance, ColTolerance, Rotation, MatchThreshold, 'gold_standard', DistanceThreshold, RandSeed, ProjMatrix, Points1, Points2)
*累积转换矩形
ProjMatrices := [ProjMatrices,ProjMatrix]
* 累积匹配点
Rows1 := [Rows1,subset(RowFAll,Points1)]
Cols1 := [Cols1,subset(ColFAll,Points1)]
Rows2 := [Rows2,subset(RowTAll,Points2)]
Cols2 := [Cols2,subset(ColTAll,Points2)]
NumCorrespondences := [NumCorrespondences,|Points1|]
*生成交叉点表示平铺图像中提取的点
gen_cross_contour_xld (PointsF, RowFAll + FShiftR, ColFAll + FShiftC, 6, rad(45))
gen_cross_contour_xld (PointsT, RowTAll + TShiftR, ColTAll + TShiftC, 6, rad(45))
*用区域点对生成线段,从线段生成XLD轮廓,从而可以在窗口中进行缩放查看区域效果。
RowF := subset(RowFAll,Points1) + FShiftR
ColF := subset(ColFAll,Points1) + FShiftC
RowT := subset(RowTAll,Points2) + TShiftR
ColT := subset(ColTAll,Points2) + TShiftC
gen_empty_obj (Matches)
for K := 0 to |RowF| - 1 by 1
gen_contour_polygon_xld (Match, [RowF[K],RowT[K]], [ColF[K],ColT[K]])
concat_obj (Matches, Match, Matches)
endfor
dev_set_color ('blue')
dev_display (Matches)
dev_set_color ('green')
dev_display (PointsF)
dev_display (PointsT)
endfor
stop ()
* 设置可能的转换类型和堆叠顺序
PossibleTransformations := ['projective','affine','similarity','rigid']
StartImage := 3
StackingOrder := [6,7,8,9,10,1,2,3,4,5]
TransformRegion := 'false'
* 最后,利用投影变换生成调整后的拼接图像。
for i := 0 to |PossibleTransformations| - 1 by 1
Transformation := PossibleTransformations
bundle_adjust_mosaic (10, StartImage, From, To, ProjMatrices, Rows1, Cols1, Rows2, Cols2, NumCorrespondences, Transformation, MosaicMatrices2D, Rows, Cols, Error)
gen_bundle_adjusted_mosaic (Images, MosaicImage, MosaicMatrices2D, StackingOrder, TransformRegion, TransMat2D)
get_image_pointer1 (MosaicImage, Pointer, Type, Width, Height)
dev_set_window_extents (-1, -1, Width / 3, Height / 3)
dev_clear_window ()
dev_display (MosaicImage)
endfor
[halcon]1[/halcon]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4