affine_trans_region(Region : RegionAffineTrans : HomMat2D, Interpolate : )
affine_trans_region执行任意的2D变换仿射变换。
例如对输入区域Region ,执行任意的缩放、旋转、平移和倾斜,结果保存RegionAffineTrans 。
仿射变换由齐次变换矩阵HomMat2D来描述
这个矩阵可以用hom_mat2d_identity, hom_mat2d_scale, hom_mat2d_rotate, hom_mat2d_translate,等函数来创建。
或者用 vector_angle_to_rigid.来创建 也行。
齐次变换矩阵的分量解释为:
图像的行坐标对应于x,
列坐标对应于定义变换矩阵的坐标系的y。
这对于获得图像的右手定则坐标系是必要的。
特别是,这确保了旋转是在正确的方向上进行的。
注意,矩阵的(x,y)顺序很自然地对应于图像中坐标的正常顺序((row,column)。
参数Interpolate 决定转换是否在内部使用插值来完成。
可以使用插值模式“nearest_neighbor”和“constant”,详细描述详见affine_trans_image。
插值可以使区域边界更平滑,特别是当区域被放大时。
然而,运行时间急剧增加。
通常,affine_trans_region是不可逆的(在旋转和缩放期间进行剪切和离散)。
affine_trans_region不使用HALCON标准坐标系(原点位于左上角像素的中心),
而是使用与affine_trans_pixel相同的坐标系,即,原点位于左上角像素的左上角。
因此,affine_trans_region的使用对应为一个转换链(参见affine_trans_pixel),
它应用于该区域的每个点(输入和输出像素作为齐次向量)。
因此,在基于区域派生的坐标(例如area_center之类的操作符)创建仿射转换时,
可能会得到意想不到的结果。
例如,如果使用这个运算符计算旋转对称区域的重心,
然后使用hom_mat2d_rotate将该区域绕该点旋转,
得到的区域将不会位于原来的区域上。
在这种情况下,您可以在affine_trans_region中使用HomMat2D之前,
执行以下变换来补偿:
hom_mat2d_translate(HomMat2D, 0.5, 0.5, HomMat2DTmp)
hom_mat2d_translate_local(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)
affine_trans_region(Region, RegionAffineTrans, HomMat2DAdapted, 'false')
例程:
read_image (Image, 'printer_chip/printer_chip_01')
threshold (Image, Regions, 140, 255)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10000, 100000)
select_obj (SelectedRegions, ObjectSelected, 1)
area_center (ObjectSelected, Area, Row, Column)
orientation_region (ObjectSelected, Phi)
get_image_size (Image, Width, Height)
vector_angle_to_rigid (Row, Column,Phi,Height/2 ,Width/2 ,Phi, HomMat2D)
affine_trans_region (ObjectSelected, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
dev_display (Image)
dev_display (RegionAffineTrans)
area_center (RegionAffineTrans, Area1, Row1, Column1)
|