簡體   English   中英

3D 圖像 alignment:如何從 matlab 中的 3x3 旋轉矩陣中提取關於“靜態”x、y、z 軸的旋轉角度

[英]3D image alignment: How to extract rotation angles about “static” x,y,z axes from a 3x3 rotation matrix in matlab

我正在執行 3D 成像 alignment 使用(作為概述)以下編碼方案:

ref = imref3d(size(img(:,:,:,1)),[0 32] ,[0 32] ,[0 20] );
[optimizer, metric] = imregconfig( 'monomodal');
tform=imregtform(img(:,:,:,2), ref, img(:,:,:,1), ref, 'rigid', optimizer, metric);
transform_mat=tform.T

為澄清起見,變量img是 3D 圖像的時間序列(其中每個 3D 圖像是二維橫截面的堆棧)。 在不同的時間點,我正在成像的 object 可以移動。 因此,上述代碼的目的是生成一個幾何變換,將 3D 體積的第二個時間點 ( img(:,:,:,2) ) 與參考圖像對齊,該參考圖像是3D 卷( img(:,:,:,1) )。 優化算法最終選擇的幾何變換是 output 到 object tform tform包含一個 4x4 矩陣作為其屬性之一( T ); 正是這個 4x4 矩陣對平移和旋轉信息進行了編碼。 從上面的代碼可以看出,我將這個 4x4 矩陣存儲在變量transform_mat中。

在閱讀了很多零散的mathworks文檔后,我確定這個transform_mat變量(代表仿射剛體變換矩陣)是“后乘”形式,據我了解,這只是意味着它是轉置版本人們通常會在線性代數教科書中看到的內容。

出於我的目的,我有興趣transform_mat中提取特定的旋轉信息。 這是我到目前為止所做的:

rot_postmultiply=transform_mat(1:3,1:3); %extracting the elements that encode rotation-related info
rot_premultiply=rot_postmultply'; %transposing 

只是為了快速插入,我創建了旋轉矩陣的預乘版本,因為我相信許多作用於旋轉矩陣的函數都假設它處於其預乘形式。

從這個 3x3 旋轉矩陣中,我想提取關於參考圖像的 STATIC x 軸、y 軸和 z 軸的旋轉(以弧度為單位)。 我最初的嘗試如下:

eul = rotm2eul(rot_premultiply);

rotm2eul function 為我提供了與這個 3x3 旋轉矩陣相關的 3 個歐拉角 eul是一個 1x3 向量,根據文檔,“歐拉角旋轉的默認順序是 'ZYX'”。 但是,我不確定歐拉角是否真的在描述我想要提取的信息(即關於參考圖像的 static x、y、z 軸的旋轉)。

我沒有很強的線性代數/幾何變換背景,但我對歐拉角的理解是發生的每次旋轉都會改變坐標系 例如,在圍繞 Z 軸( eul向量中的第一個值)旋轉之后,我們現在有了新的X 和 Y 軸(稱為 X' 和 Y')。 然后“Y 軸旋轉”( eul中的第二個值)實際上是圍繞 Y' 的旋轉......而不是Y。對最終的“X 旋轉”重復這個參數(這實際上是關於 X'' 軸)。

如果有人能提供一些關於如何進行的見解(如果我對歐拉角的擔憂是正確的),我將不勝感激!

另外,如果“ static ”這個詞是不正確的術語,請見諒。 希望我提供了足夠的上下文,以免引起混淆。

如果我理解正確,您所需要的只是rotm2axang ,它將作為正交旋轉矩陣rotm給出的旋轉轉換為相應的軸角表示axang 輸入旋轉矩陣必須是旋轉的預乘形式。

rot2axang 的rot2axang是一個 n 軸角度旋轉的 n×4 矩陣。 每行的前三個元素指定旋轉軸,最后一個元素定義旋轉角度(以弧度為單位)。

如果您無法訪問具有該 function 的機器人系統工具箱,請考慮使用 此替代方法

編輯:

可以通過以下步驟將 3D 空間中的點圍繞由兩點(x1,y1,z1)(x2,y2,z2)之間的連線定義的任意軸旋轉角度alpha

  1. 平移,使旋轉軸通過原點
  2. 繞 x 軸旋轉,使旋轉軸位於 xz 平面內(或在 xz 平面上的投影)
  3. 繞 y 軸旋轉,使旋轉軸位於 z 軸(或 z 軸上的投影)
  4. 繞 z 軸按alpha旋轉
  5. 步驟 3 的倒數
  6. 步驟 2 的倒數
  7. 步驟 1 的倒數

您是在詢問步驟 2,3 中的角度嗎?

否則,您是否已經在您旋轉的軸的原點?

如果確實需要步驟 2,3 中的角度,則:

第 1 步是通過轉換矩陣 T 完成的:

T =  [ 1    0   0   -x1
      0     1   0   -y1
      0     0   1   -z1
      0     0   0   1  ];

    

步驟 #2 通過以下方式完成:假設v = (a,b,c)是沿旋轉軸的單位向量,則d = sqrt(b^2 + c^2)作為投影到yz飛機。 然后旋轉旋轉軸在 yz 平面上的投影與由單位向量v的 z 分量與其 yz 投影的點積給出的 z 軸之間的角度。 這個角度 ( beta ) 由以下公式確定: cos(beta) = dot([0,0,c],[0,b,c]) /(c*d) = c/d, sin(beta) = cross( [0,0,c],[0,b,c]) /(c*d) = b/d

因此旋轉矩陣 Rx 為:

Rx = [ 1    0     0     0
       0    c/d  -b/d   0
       0    b/d   c/d   0
       0    0     0     1 ] ;

步驟 3 我們繞 y 軸旋轉,使旋轉軸位於 z 軸正方向。 使用點積和叉積關系,角度的余弦是d ,角度的正弦是a 繞 y 軸 Ry 的旋轉矩陣為

Ry = [ d    0   -a  0
       0    1   0   0
       a    0   d   0
       0    0   0   1];

最后,我們簡單地圍繞 z 旋轉角度alpha

Rz = [ cos(alpha)   sin(alpha)  0   0
      -sin(alpha)   cos(alpha)  0   0
       0            0           1   0
       0            0           0   1 ] ;

我認為這個問題的答案應該對您有所幫助:將 3D 旋轉分解為笛卡爾分量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM