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

2021-09-07 21:29:49 字數 2455 閱讀 7699

這個算是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:90x = 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)];

endendp=[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

endq=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練習程式(DBSCAN)

和kmeans相比,不需要事先知道資料的類數。以程式設計的角度來考慮,具體演算法流程如下 1.首先選擇乙個待處理資料。2.尋找和待處理資料距離在設定半徑內的資料。3.將找到的半徑內的資料放到乙個佇列中。4.拿佇列頭資料作為當前待處理資料並不斷執行第2步。5.直到遍歷完佇列中所有資料,將這些資料記為一...

matlab練習程式(c c 呼叫matlab)

就我目前了解的c 呼叫matlab有兩種方法。第一種是通過matlab引擎呼叫,也就是這裡用到的方法。第二種是用matlab將m檔案編譯為相應的h lib dll檔案再加以呼叫。使用engine所用到的h和lib檔案基本在d program files matlab r2010b extern裡面,...

matlab練習程式(SUSAN檢測)

susan運算元既可以檢測角點也可以檢測邊緣,不過角點似乎比不過harris,邊緣似乎比不過canny。不過思想還是有點意思的。主要思想就是 首先做乙個和原影象等大的目標影象。然後用乙個圓形的模板,用模板去遍歷原影象每個畫素,把模板內的每個畫素都和模板中心畫素比較,如果灰度小於乙個閾值,那麼就對目標...