【Halcon学习笔记】10.仿射变换(2D)
1.概述
仿射变换,即在二维平面内,对象进行平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)等操作。
仿射变换可以保持原来的线共点、点共线的关系不变;保持原来相互平行的线仍然平行;保持原来的中点仍然是中点;保持原来在一直线上几段线段之间的比例关系不变;但不能保持原来的线段长度和夹角角度不变。

2.相关算子
2.1 创建(创建一个空的二维空变换矩阵)
1)hom_mat2d_identity()
HomMat2D:变换矩阵
2.2 添加(添加“旋转/缩放/平移”到变换矩阵)
1)hom_mat2d_rotate()
HomMat2D:输入的变换矩阵
Phi:旋转角度
Px:旋转中心x坐标
Py:旋转中心y坐标
HomMat2DRotate:输出的变换矩阵
2)hom_mat2d_scale()
HomMat2D:输入的变换矩阵
Sx:沿x轴缩放比例
Sy:沿y轴缩放比例
Px:缩放中心x坐标
Py:缩放中心y坐标
HomMat2DScale:输出的变换矩阵
3)hom_mat2d_translate()
HomMat2D:输入的变换矩阵
Tx:沿x轴平移量
Ty:沿y轴平移量
HomMat2DTranslate:输出的变换矩阵
2.3 计算(计算变换矩阵)
1)vector_angle_to_rigid() //根据2个点坐标和角度计算变换矩阵(旋转/平移)
Row1:原点行坐标
Column1:原点列坐标
Angle1:原点角度
Row2:变换点行坐标
Column2:变换点列坐标
Angle2:变换点角度
HomMat2D:输出的变换矩阵
2) vector_to_rigid() //根据2个以上点坐标计算变换矩阵(旋转/平移)
Px:原点的x坐标集
Py:原点的y坐标集
Qx:变换点的x坐标集
Qy:变换点的y坐标集
HomMat2D:输出的变换矩阵
3)vector_to_similarity() //根据2个以上点坐标计算变换矩阵(旋转/平移/缩放)
4)vector_to_hom_mat2d() //根据3个以上点坐标计算变换矩阵(旋转/平移/缩放/斜切)
2.4 执行(执行仿射变换)
1)affine_trans_region() //对区域进行二维仿射变换
Region:待变换的额区域
RegionAffineTrans:变换后的区域
HomMat2D:变换矩阵
Interpolate:插值方式
2)affine_trans_image() //对图像进行二维仿射变换
3)affine_trans_contour_xld() //对XLD进行二维仿射变换
4)affine_trans_polygon_xld() //对XLD多边形进行二维仿射变换
5)affine_trans_point_2d() //对点进行二维仿射变换
6) affine_trans_pixel() //对像素进行二维仿射变换
2.5 查看(查看仿射变换参数)
1)hom_mat2d_to_affine_par()
HomMat2D:输入的变换矩阵
Sx:沿x轴缩放比例
Sy:沿y轴缩放比例
Phi:旋转角度
Theta:斜切角度
Tx:沿x轴平移量
Ty:沿y轴平移量
3.仿射变换在Halcon中的应用步骤
3.1 场景1:根据输入的参数直接生成变换矩阵
1)创建一个单位矩阵
hom_mat2d_identity(HomMat2D)
2)输入参数,生成变换矩阵
hom_mat2d_translate (HomMat2D, 100, 100, HomMat2DTranslate)
3)对区域进行仿射变换
affine_trans_region (Region, RegionTranslate, HomMat2DTranslate, 'nearest_neighbor')

3.2 场景2:根据已知的参数(点、角度)计算生成变换矩阵(区域跟随、标定)
1)设定模板图片的标记点,RowM, ColM
read_image (ImageModel, path+'/model.jpg')
threshold (ImageModel, Region, 0, 50)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ['area','width'], 'and', [3000,40], [6000,70])
opening_circle (SelectedRegions, RegionOpeningM, 9.5)
area_center (RegionOpeningM, AreaM, RowM, ColM)
elliptic_axis (RegionOpeningM, Ra, Rb, PhiM)
dev_display (ImageModel)
disp_cross (WindowHandle, RowM, ColM, 100, 0)
disp_message(WindowHandle, 'MarkModel:'+RowM$'.0f'+','+ColM$'.0f', 'window', 0,0, 'green', 'false')

2)设定基于标记点偏移的区域,RoiM
gen_rectangle2 (RoiM, 1026.82, 1137.46, rad(-0.150432), 177.281, 35.8157)

3)在新的图像上求出标记点,Row, Col
read_image (Image, path+'/detect.jpg')
threshold (Image, Region, 0, 50)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ['area','width'], 'and',[1000,20], [8000,90])
opening_circle (SelectedRegions, RegionOpening, 9.5)
area_center (RegionOpening, Area, Row, Col)
elliptic_axis (RegionOpening, Ra, Rb, Phi)
dev_display (Image)
disp_cross (WindowHandle, Row, Col, 100, 0)
disp_message(WindowHandle, 'MarkImage:'+Row$'.0f'+','+Col$'.0f', 'window', 0,0, 'green', 'false')

4)根据(RowM, ColM, PhiM)和(RowM, ColM, Phi)求出变换矩阵,HomMat2D
hom_mat2d_identity (HomMat2D)
vector_angle_to_rigid (RowM, ColM, PhiM, Row, Col, Phi, HomMat2D)
5)对RoiM进行仿射变换
affine_trans_region (RoiM, Roi, HomMat2D, 'nearest_neighbor')


by Ryou2-

