什么是仿射变换?
仿射变换是指在几何中,一个空间向量进行一次线性变换并接上一个平移,变换为另一个向量空间。
比如说某一矩形的某一顶点发生平移旋转后的位置。
关键算子:
vector_angle_to_rigid
affine_trans_point_2d
实验与测试:
halcon代码:
dev_set_draw ('margin')
RR1:=50
CC1:=100
RR2:=150
CC2:=300
gen_rectangle1 (ROI_0, RR1, CC1, RR2, CC2)
area_center (ROI_0, Area, Row, Column)
gen_cross_contour_xld (Cross,Row, Column , 20, 0)
dev_set_color ('green')
*变换前的点
gen_cross_contour_xld (Cross1,RR1, CC1 , 20, 0.785398)
gen_cross_contour_xld (Cross2,RR2, CC2 , 20, 0.785398)
*仿射变换
vector_angle_to_rigid (Row, Column, rad(0), Row, Column, rad(30), HomMat2D)
affine_trans_point_2d (HomMat2D, RR1, CC1, Qx, Qy)
*显示变换后的点
gen_cross_contour_xld (Cross3,Qx, Qy , 20, 0.5)
stop()
*以下为测试变换结果是否正确
affine_trans_region (ROI_0, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
*辅助圆
*半径
distance_pp (RR1, CC1, Row, Column, Distance)
gen_circle_contour_xld (ContCircle, Row, Column, Distance, 0, 6.28318, 'positive', 1)
stop ()
运用数学方式实现仿射变换:
仿射变换可以拆解为一个物体发生1、位移,2、变换 后的坐标位置 平移好处理,旋转我们可以发现物体都是围绕一个点进行旋转的,旋转一周刚好形成一个圆的轮廓。于是可以用圆上任意点的公式进行计算:
x = x0+R*cosθ
y = y0+R*sinθ
式中x和y是任意一点坐标,x0和y0是围绕的中心点坐标,R是半径
代码:
*求矩形旋转30°后左上角顶点坐标
dev_set_draw ('margin')
Phi:=rad(30)
RR1:=50
CC1:=100
RR2:=150
CC2:=300
gen_rectangle1 (ROI_0, RR1, CC1, RR2, CC2)
area_center (ROI_0, Area, Row, Column)
gen_cross_contour_xld (Cross,Row, Column , 20, 0)
*显示左上角顶点
gen_cross_contour_xld (Cross,50, 100 , 30, 0.5)
*以下使用圆上任意一点公式实现数学方式的仿射变换
*x = x0+R*cosθ
*y = y0+R*sinθ
dev_set_color ('green')
*半径
distance_pp (RR1, CC1, Row, Column, Distance)
*左上角顶点到中心点线段与Row轴的斜率
angle_lx (RR1, CC1, Row, Column, Angle)
*式中的-rad(180)-Angle-rad(30)这些参数取决于圆的画向是顺时针的
ORR:=Row+Distance*sin(-rad(180)-Angle-rad(30))
OCC:=Column+Distance*cos(-rad(180)-Angle-rad(30))
gen_cross_contour_xld (Cross, ORR, OCC, 20, 0)
*测试结果是否正确
vector_angle_to_rigid (Row, Column, rad(0), Row, Column, rad(30), HomMat2D)
affine_trans_region (ROI_0, RegionAffineTrans, HomMat2D, 'nearest_neighbor')