Halcon中旋轉、標定、位姿矩陣的說明


旋轉矩陣

對於視覺算法工程師而言,理解矩陣的數學,物理原理十分重要,大多數人對矩陣的理解僅限於解析數學公式上面,其實這跟國內的線性代數教材有關,推薦大家去網上找麻省理工的線性代數公開課看看,從物理應用的角度去講線性代數,相信你會有更對的收獲。本篇博客主要講解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學習十分重要,大家一定要多仔細研究。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM