我只是尝试将一些点云注册到另一个点云。如果绘制这两种云,它们看起来非常相似,但注册不起作用。我假设它至少有一个 rmse < 0.2。现在,它位于 rmse = 0.8,看起来需要再旋转一次。我尝试了使用 matlab 内置函数的不同注册方法,但没有任何效果。我还尝试预先注册将第一点放在第一点上(我知道哪一点需要相同)。它工作得更糟。
如果您有任何想法,请告诉我。
function []= Array_ArrayRegistration(plot)
%Two arrays i want to register
MovingArray = [8.005372317 7.957347634 7.854595872 7.785310825 7.91180404 7.795050408 7.845085681 7.793559547
; -0.969680576 -0.97721379 -0.965088404 -0.97101846 -2.428743284 -2.424770284 -4.379118215 -4.401760619
; 1.075512172 -0.332549534 -1.74935248 -3.143950086 -0.736528837 -2.729442603 -0.703126631 -2.727037007
];
MovingArray = MovingArray';
FixedArray = [ 3.24 4.19 5.18 6.21 4.47 5.88 4.52 5.89;-15.13 -14.05 -13.11 -12.12 -13.8 -12.41 -13.84 -12.39
;12.99 13 13.01 13.01 11.59 11.6 9.59 9.6];
FixedArray = FixedArray';
MovingArrayptCloud = pointCloud(MovingArray);
FixedArrayptCloud = pointCloud(FixedArray);
rmseOld = 1000;
rmse = 100;
while rmse > 0.4
[tform, movingReg, rmse] = pcregistericp(MovingArrayptCloud ,FixedArrayptCloud);
if rmseOld > rmse
MovingArrayptCloud = movingReg;
disp(rmse)
rmseOld = rmse;
else
rmse = 0.2;
end
end
% while rmse > 0.4
%
% [tform, movingReg, rmse] = pcregrigid(MovingArrayptCloud ,FixedArrayptCloud);
%
% if rmseOld > rmse
% MovingArrayptCloud = movingReg;
% disp(rmse)
% rmseOld = rmse;
% else
% rmse = 0.2;
% end
% end
% while rmse > 0.4
%
% [tform, movingReg, rmse] = pcregistercpd(MovingArrayptCloud ,FixedArrayptCloud, 'Transform' ,'Rigid');
%
% if rmseOld > rmse
% MovingArrayptCloud = movingReg;
% disp(rmse)
% rmseOld = rmse;
% else
% rmse = 0.2;
% end
% end
%% Plot
fig3= figure;
p1=plot3(movingReg.Location(:,1),movingReg.Location(:,2),movingReg.Location(:,3),'.b','markerSize' ,15);
hold on
p2=plot3(FixedArray(:,1),FixedArray(:,2),FixedArray(:,3),'.black', 'markerSize', 15);
grid on
hold off
xlabel('x-direction [mm]')
ylabel('y-direction [mm]')
zlabel('z-direction [mm]')
legend([p1,p2],'EMT-1','CT 2','Location','northeast')
end