旋轉矩陣
對於視覺算法工程師而言,理解矩陣的數學,物理原理十分重要,大多數人對矩陣的理解僅限於解析數學公式上面,其實這跟國內的線性代數教材有關,推薦大家去網上找麻省理工的線性代數公開課看看,從物理應用的角度去講線性代數,相信你會有更對的收獲。本篇博客主要講解halcon中牽扯到的旋轉矩陣說明,也有助於大家理解仿射變換,坐標系轉換,標定等等。
Halcon中的HomMat2D
在halcon中牽扯到矩陣轉換的有兩個方面,在一個坐標系內旋轉變換(仿射變換),在兩個坐標系之間的轉換。
這里就代表一個坐標系(在halcon中就是對某個圖像的像素坐標系旋轉等做變換),像素坐標系的原點從(0,0)平移到了(5,5),同時坐標系一開始與水平方向的夾角是0度,逆時針旋轉了30度。

打開halcon的數據窗口,觀察這時候的HomMat2D的值可以看到

這里便是我們常見的旋轉和平移的齊次坐標矩陣。這里的5是0到5的相對平移。

那這個旋轉矩陣在halcon中怎么用呢?我用以下幾個例子說明幫助大家理解。
vector_angle_to_rigid (0,0,0,5,5,rad(30), HomMat2D) affine_trans_image (Image, ImageAffinTrans, HomMat2D, 'constant', 'false')
這個齊次坐標矩陣使圖像發生了旋轉和坐標系原點的平移.

之前像素坐標系的原點在左上角(0,0)處平移到了(5,5)處,圖像逆時針旋轉了30度
那么如果是順時針旋轉30度呢?只需要更改下順序即可
//逆時針30度 vector_angle_to_rigid (0,0,0,5,5,rad(30), HomMat2D) //順時針30度 vector_angle_to_rigid (0, 0, rad(30), 5, 5, 0, HomMat2D)
那么還有個問題?旋轉問題需要確定兩點,那就是旋轉中心和旋轉角度,假如說在當前像素坐標系下我只需要將圖像繞某一點旋轉,如(300,400)逆時針旋轉30度,只需要
vector_angle_to_rigid (300, 400, 0, 300, 400, rad(30), HomMat2D)
這樣的話,就沒有發生相對位移,只有相對旋轉了30度
同樣的,HomMat2D不僅僅應用在圖像的旋轉上,還可以對區域,像素點進行旋轉
vector_angle_to_rigid (0,0,0,5,5,rad(30), HomMat2D) //對區域進行轉換 affine_trans_region (Region, RegionAffineTrans, HomMat2D, 'nearest_neighbor') //對像素點進行轉換,從(64,64)變換到(QX,QY) affine_trans_point_2d (HomMat2D, 64, 64, Qx, Qy)
當然,生成HomMat2D矩陣的算子不只一種,其余還可以生成矩陣的算子有
//生成一個單位矩陣,表示什么也不做 hom_mat2d_identity (HomMat2DIdentity) //在單位矩陣的基礎上增加旋轉角度和旋轉中心 hom_mat2d_rotate (HomMat2DIdentity, rad(30), 0, 0, HomMat2DRotate) //在單位矩陣的基礎上增加平移,坐標原點從(0,0)到了(1,1) hom_mat2d_translate (HomMat2DIdentity, 1, 1, HomMat2DTranslate)
以上都是在同一個坐標系下hommat2d矩陣代表的意義。那么從數學的角度如何說明呢?
AX=B
HomMat2D便是X,A是Image,與HomMat2D相乘后變成了ImageAffines
A也可以是區域,也可以是原像素點(1,1)
HomMat2D也可以是**兩個坐標系之間**的關系,這時候 ,HomMat2D便不僅僅是旋轉矩陣了,在手眼標定的過程中,利用現有的圖像像素坐標點和機器人坐標點,便可以求出HomMat2D
上圖是九點標定的示意圖,同一個物體,在像素坐標系下是(PX,PY),在機器人坐標系下是(QX,QY).
同一個物體,在不同的坐標系下坐標數值不同,那么兩個坐標系之間的轉換關系便是HomMat2D

Px:=[1,2,3,4,5,6,7,8,9] Py:=[1,2,3,4,5,6,7,8,9] Qx:=[10,20,30,40,50,60,70,80,90] Qy:=[10,20,30,40,50,60,70,80,90] vector_to_hom_mat2d (Px, Py, Qx, Qy, HomMat2D)
總共有9個點,在像素坐標系下是(1,1),(2,2)......在機器人坐標系下是(10,10),(20,20).........根據已知的9個點,便可以求出來HomMat2D
接下來便可以根據HomMat2D將像素坐標系下的點轉換成機器人坐標系下的點
vector_to_hom_mat2d (Px, Py, Qx, Qy, HomMat2D) //將像素坐標系下的(64,64)轉化成機器人坐標系下的(QX1,QY1) affine_trans_point_2d (HomMat2D, 64, 64, Qx1, Qy1)
這時候的數學原理AX=B
X是HomMat2D,代表兩個像素坐標系下的轉換矩陣
A代表像素坐標系下的點,B代表機器人坐標系下的點
Halcon中的HomMat3D
同樣的,HomMat3D可以是一個像素坐標系下的旋轉平移關系,也可以代表兩個坐標系之間的關系。不同的是,這時候不是二維坐標系,而是三維坐標系。HomMat2D是3乘3的齊次坐標矩陣,HomMat3D是4*乘4的齊次坐標矩陣。
//生成單位矩陣 hom_mat3d_identity (HomMat3DIdentity) //在單位矩陣的基礎上,繞x軸旋轉30度 hom_mat3d_rotate (HomMat3DIdentity, rad(30), 'x', 0, 0, 0, HomMat3DRotate)
之前說過,九點標定只是手眼標定中一項,是平面之間的手眼標定,求3D圖像和實際3維空間中知道高度信息的物體之間的手眼標定關系,便可以使用
vector_to_hom_mat3d ('rigid', Px, Py, Pz, Qx, Qy, Qz, HomMat3D)
Halcon中的位姿pose
在halcon中,兩個矩陣之間的轉換關系不僅僅可以用HomMat3D表示,也可以用位姿pose表示。具體位姿是什么(歐拉角,旋轉方法等......大家自行百度機器人學的內容)
//將齊次坐標系轉換為位姿 hom_mat3d_to_pose (HomMat3D, Pose) //將位姿轉換為齊次坐標系 pose_to_hom_mat3d (Pose, HomMat3D) //更改位姿的表達類型 convert_pose_type (Pose, 'Rp+T', 'gba', 'point', PoseOut)
所以在看Halcon相關手眼標定例程中,有時候用位姿pose表示,有時候用HomMat3D表示,其物理原理是一樣的,只不過是數學表達方式不同

這里使用HomMat3D代表的4乘4的齊次坐標矩陣

轉化成用Pose表示后,便是6乘1的矩陣類型
結束語
在仿射變換,手眼標定的過程中經常遇到矩陣,結合矩陣的數學原理和Halcon實際的物理變換有助於理解這個過程,對於提高Halcon學習十分重要,大家一定要多仔細研究。
