0

我只是尝试将一些点云注册到另一个点云。如果绘制这两种云,它们看起来非常相似,但注册不起作用。我假设它至少有一个 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
4

0 回答 0