基于ICP算法的三维点云数据拼接算法的实现

214 篇文章 51 订阅

1.问题描述:

通过合并比例因子引入标准迭代最近点(ICP)算法中,我将配准问题转化为一个7D的约束优化问题非线性空间。然后,我们应用奇异值分解(SVD)一种迭代求解此类优化问题的方法。最后,建立了一种新的ICP配准算法,称为Scale-ICP算法具有各向同性拉伸的数据集。为了实现算法的全局收敛性,我们提出了一种初始注册的选择方法。证明所提出的方法的性能和效率算法中,我们给出了几个与Scal算法的比较实验

2.部分程序:

 

function c = Solvecircle(s,R,T,I,X,Y,Yo)

pointx = length(X(1,:));
%pointy = length(Y(1,:));
%X进行变化X--Xo--接近Y
Xo = s*R*X+repmat(T,[1 pointx]);

%dsearchn求Z,即Y中对应X的数据
k = dsearchn(Y',Yo,Xo');
Z = Y(:,k);

%计算当前ek差值
en = computeE(s,R,T,X,Z);
%计算H矩阵
xc = mean(X,2); %xc,zc为坐标中点
zc = mean(Z,2);
%H = zeros(3,3);
% 计算Xi,Zi
Xi = X - repmat(xc,[1 pointx]);
Zi = Z - repmat(zc,[1 pointx]);

%计算Rk+1
Rn = computeR(Xi,Zi);
%计算s-k+1 
sn = computeS(I,Rn,Xi,Zi);
%计算Tk+1
Tn = computeT(zc,sn,Rn,xc);
%对于k+1数据的e,fn
fn = computeE(sn,Rn,Tn,X,Z);
c = cell({Rn;Tn;sn;en;fn});
end
 
%计算Rk+1
function Rn=computeR(Xi,Zi)
H = Xi*(Zi');
[U S V] = svd(H);
if round(det(V*U')) == 1
    Rn = V*U';
elseif round(det(V*U')) == -1
    x = [1 0 0;0 1 0;0 0 -1];
    Rn = V*x*U';
end
end

%计算sk+1
function sn = computeS(I,Rn,Xi,Zi)
sn = sum(dot(Rn*Xi,Zi))/sum(dot(Xi,Xi));
if sn <=  I(1)
    sn = I(1);
elseif sn >= I(2)
    sn = I(2);    
end
end


%计算Tk+1
function Tn = computeT(zc,sn,Rn,xc)
Tn = zc - sn*Rn*xc;
end


%计算Ek+1
function e = computeE(s,R,T,X,Z) 
pointx = length(X(1,:));
c = s.*(R*X)+repmat(T,[1 pointx])-Z;
e = sum(dot(c,c));
end

3.仿真结论:

D-72

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值