affine_trans_contour_xld(Contours : ContoursAffineTrans : HomMat2D : )
affine_trans_contour_xld应用任意仿射2D变换,
即,缩放、旋转、平移和倾斜(倾斜)到Contours 中给出的XLD轮廓,
转换后轮廓保存于ContoursAffineTrans。
仿射变换由HomMat2D中的齐次变换矩阵表示,
HomMat2D 可以由函数
hom_mat2d_identity,
hom_mat2d_scale,
hom_mat2d_rotate,
hom_mat2d_translate,或vector_angle_to_rigid.创建。
齐次变换矩阵的分量解释为:
图像的行坐标,列坐标对应于定义变换矩阵的坐标系的x,y。
这对于获得图像的右手坐标系是必要的。
特别是,这确保了旋转是在正确的方向上进行的。
注意,矩阵的(x,y)顺序很自然地对应于图像中坐标的通常顺序(row,column)。
affine_trans_contour_xld不使用HALCON标准坐标系(原点位于左上角像素的中心),
而是使用与affine_trans_pixel相同的坐标系,即,原点位于左上角像素的左上角。
因此,应用affine_trans_contour_xld对应于一个转换链(参见affine_trans_pixel),
它应用于轮廓的每个点(输入和输出像素作为齐次向量)。
因此,在基于从轮廓派生的坐标(例如area_center_xld之类的操作符)创建仿射转换时,
可能会得到意想不到的结果。
例如,如果使用这个操作符计算旋转对称的XLD轮廓的重心,
然后使用hom_mat2d_rotate将轮廓绕该点旋转,
得到的轮廓将不会位于原来的轮廓上。
在这种情况下,您可以通过在affine_trans_contour_xld中使用HomMat2D之前,
使用下面代码来补偿:
hom_mat2d_translate(HomMat2D, 0.5, 0.5, HomMat2DTmp)
hom_mat2d_translate_local(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)
affine_trans_contour_xld(Contours, ContoursAffineTrans, HomMat2DAdapted)
例程
read_image (Image, 'printer_chip/printer_chip_01')
threshold (Image, Region, 128, 255)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 25000, 100000)
select_obj (SelectedRegions, ObjectSelected, 1)
gen_contour_region_xld (ObjectSelected, Contours, 'border')
*将区域移动到图像中心
area_center_xld (Contours, Area, Row, Column, PointOrder)
orientation_xld (Contours, Phi)
get_image_size (Image, Width, Height)
vector_angle_to_rigid (Row, Column, Phi, Height/2, Width/2, Phi, HomMat2D)
affine_trans_contour_xld (Contours, ContoursAffineTrans, HomMat2D)
dev_display (Image)
dev_display (ContoursAffineTrans)
例程事先读取图像提取一个区域,通过此区域生成对应的一个XLD轮廓。
获取轮廓旋转角度,中心点,再获取图像中心点。
使用前面的参数生成一个 齐次变换矩阵HomMat2D,
最后使用此矩阵平移XLD轮廓。
要注意的是一句
vector_angle_to_rigid (Row, Column, Phi, Height/2, Width/2, Phi, HomMat2D)
Row对应Y,对应Height/2,相应Column对应X,对应Width/2
|