1. 程式人生 > >matlab練習程序(對應點集配準的四元數法)

matlab練習程序(對應點集配準的四元數法)

amd 練習 size blank sigma 特征值 分享 lam dia

這個算是ICP算法中的一個關鍵步驟,單獨拿出來看一下。

算法流程如下:

1.首先得到同名點集P和X。

2.計算P和X的均值up和ux。

3.由P和X構造協方差矩陣sigma。

4.由協方差矩陣sigma構造4*4對稱矩陣Q。

5.計算Q的特征值與特征向量。其中Q最大特征值對應的特征向量即為最佳旋轉向量q。

6.通過四元數q得到旋轉矩陣R。

7.根據R計算最佳平移向量qr。

具體公式我就不貼圖了,可以參考這篇“ICP算法在點雲配準中的應用”論文的3.1節。

處理效果如下:

原始點集:

技術分享圖片

其中藍點為原始點集,紅點為旋轉平移後的點集。

配準後點集:

技術分享圖片

計算得到的旋轉平移矩陣,通過對藍點集進行轉換得到綠點集,比較紅點集與綠點集是否基本一致。

matlab代碼如下:

clear all;
close all;
clc;

%生成原始點集
X=[];Y=[];Z=[];
for i=-180:2:180
    for j=-90:2:90
        x = i * pi / 180.0;
        y = j * pi / 180.0;   
        X =[X,cos(y) * cos(x)];
        Y =[Y,sin(y) * cos(x)];
        Z =[Z,sin(x)]; 
    end
end
P
=[X(1:3000) Y(1:3000) Z(1:3000)]; %生成變換後點集 i=0.5;j=0.3;k=0.7; Rx=[1 0 0;0 cos(i) -sin(i); 0 sin(i) cos(i)]; Ry=[cos(j) 0 sin(j);0 1 0;-sin(j) 0 cos(j)]; Rz=[cos(k) -sin(k) 0;sin(k) cos(k) 0;0 0 1]; R=Rx*Ry*Rz; X=P*R + [0.2,0.3,0.4]; plot3(P(:,1),P(:,2),P(:,3),b.); hold on; plot3(X(:,1),X(:,2),X(:,3),r.);
%計算點集均值 up = mean(P); ux = mean(X); P1=P-up; X1=X-ux; %計算點集協方差 sigma=P1*X1/(length(X1)); sigma_mi = sigma - sigma; M=sigma+sigma-trace(sigma)*[1,0,0;0,1,0;0,0,1]; %由協方差構造4*4對稱矩陣 Q=[trace(sigma) sigma_mi(2,3) sigma_mi(3,1) sigma_mi(1,2); sigma_mi(2,3) M(1,1) M(1,2) M(1,3); sigma_mi(3,1) M(2,1) M(2,2) M(2,3); sigma_mi(1,2) M(3,1) M(3,2) M(3,3)]; %計算特征值與特征向量 [x,y] = eig(Q); e = diag(y); %計算最大特征值對應的特征向量 lamda=max(e); for i=1:length(Q) if lamda==e(i) break; end end q=x(:,i); q0=q(1);q1=q(2);q2=q(3);q3=q(4); %由四元數構造旋轉矩陣 RR=[q0^2+q1^2-q2^2-q3^2 ,2*(q1*q2-q0*q3), 2*(q1*q3+q0*q2); 2*(q1*q2+q0*q3), q0^2-q1^2+q2^2-q3^2, 2*(q2*q3-q0*q1); 2*(q1*q3-q0*q2), 2*(q2*q3+q0*q1), q0^2-q1^2-q2^2+q3^2]; %計算平移向量 qr=ux-up*RR; %驗證旋轉矩陣與平移向量正確性 Pre = P*RR+qr; figure; plot3(P(:,1),P(:,2),P(:,3),b.); hold on; plot3(X(:,1),X(:,2),X(:,3),r.); plot3(Pre(:,1),Pre(:,2),Pre(:,3),go);

matlab練習程序(對應點集配準的四元數法)