這個算是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。不過思想還是有點意思的。主要思想就是 首先做乙個和原影象等大的目標影象。然後用乙個圓形的模板,用模板去遍歷原影象每個畫素,把模板內的每個畫素都和模板中心畫素比較,如果灰度小於乙個閾值,那麼就對目標...