三維離散點最優空間圓擬合及實現

已知三維空間離散點座標(xi, yi, zi),構建一個空間圓使得空間點儘可能靠近擬合的空間圓。效果如下圖

首先,所有離散點儘可能在一個平面上,平面方程可表示爲

ax+by+cz-1=0                                                                                                             (1)

寫成矩陣形式爲,

MA=L_1,式中

M=\begin{bmatrix} x1& x2& ...& xn\\ y1& y2& ...& yn\\ z1& z2& ... &zn \end{bmatrix}^{T}A=(a,b,c)^{T}L_1=(1, 1, ..., 1)^{T}                                              (2)

這是一個超定方程求解,根據最小二乘法,可以求出A=(M^{T}M)^{-1}M^{T}L_1,即平面的法向向量。

假設所有離散點都在圓上,那麼任意兩點的連線的中垂線必過圓心。設圓心C(x0,y0,z0),取兩個點P1(x1,y1,z1)與P2(x2,y2,z2),則P1和P2連線的向量vector1表示爲(x2-x1,y2-y1,z2-z1),P1和P2連線的中點座標P12爲(\frac{x1+x2}{2},\frac{y1+y2}{2},\frac{z1+z2}{2},)

圓心C與P12連線向量vector2爲(\frac{x1+x2}{2}-x0,\frac{y1+y2}{2}-y0,\frac{z1+z2}{2}-z0,)。要想P1與P2在圓上,則滿足vector1*vecotor2=0,即

(x2-x1,y2-y1,z2-z1)\cdot (\frac{x1+x2}{2}-x0,\frac{y1+y2}{2}-y0,\frac{z1+z2}{2}-z0)=0

整理一下,有

\Delta x_{12}\cdot x_{0}+\Delta y_{12}\cdot y_{0}+\Delta z_{12}\cdot z_{0}-l_{1}=0,

式中  \Delta x_{12}=x_{2}-x_{1},\Delta y_{12}=y_{2}-y_{1},\Delta z_{12}=z_{2}-z_{1},l_{1}=\frac{x_{2}^{2}+y_{2}^{2}+z_{2}^{2}-x_{1}^{2}-y_{1}^{2}-z_{1}^{2}}{2}

所有點都在圓上,則有

                                         (3)

寫成矩陣形式   BC=L_2

式中

上述方程亦爲超定方程,變換成適定形式爲

                                                                                                    (4)

由於圓心C必在前述控制的平面內,因此滿足ax_0+by_0+cz_0-1=0, 即 

                                                                                                                  (5)

A爲平面的法向量,通過 A=(M^{T}M)^{-1}M^{T}L_1  已求出,因而可將式(4)和式(5)合併,寫成一個擴展式進行求解

,式中

則求解圓心座標C=(D^{T}D)^{-1}D^{T}L_3

圓的半徑可由所有點到圓心的距離的平均值確定:

具體matlab程序實現如下

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Project: 3D circle fitting
% Author: jiangjp
%         [email protected]
%         Wuhan University of Technology
% Date:   25/10/2019
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear all;
clc;
close all;

%%%   無誤差空間圓擬合點  %%%
% M=[-0.3 0.46 0.83;...
%     -0.2 0.254 0.946;...
%     -0.1 0.111 0.989;...
%     0 0 1;...
%     0.1 -0.0910 0.991;...
%     0.2 -0.166 0.966;...
%     0.3 -0.227 0.927;...
%     0.4 -0.275 0.874;...
%     0.5 -0.309 0.809;...
%     0.6 -0.329 0.729;...
%     0.7 -0.332 0.632;...
%     0.8 -0.312 0.512;...
%     0.9 -0.254 0.354;...
%     0.8 0.512 -0.312;...
%     0.7 0.632 -0.332;...
%     0.6 0.729 -0.329;...
%     0.5 0.809 -0.309;...
%     0.4 0.874 -0.274;...
%     0.3 0.927 -0.227;...
%     0.2 0.966 -0.166;...
%     0.1 0.991 -0.091;...
%     0 1 0;...
%     -0.1 0.989 0.111;...
%     -0.2 0.946 0.254;...
%     -0.3 0.83 0.45];

%%%   含誤差空間圓擬合點  %%%
M=[11.5713 6.9764 10.4685;...
    11.5859 9.088 13.5831;...
    11.5802 11.1949 14.6103;...
    11.5542 13.312 14.7279;...
    11.5692 15.3806 14.0576;...
    11.5632 17.4873 12.1397;...
    11.5598 17.8894 6.4025;...
    11.5577 15.8714 4.0703;...
    11.5729 13.8578 3.232;...
    11.5657 11.8711 3.1326;...
    11.5706 9.8797 3.7866;...
    11.5663 7.8676 5.5348];

[num dim]=size(M);

L1=ones(num,1);
A=inv(M'*M)*M'*L1;       % 求解平面法向量

B=zeros(num-1,3);
for i=1:num-1
    B(i,:)=M(i+1,:)-M(i,:);
end

L2=zeros(num-1,1);
for i=1:num-1
    L2(i)=(M(i+1,1)^2+M(i+1,2)^2+M(i+1,3)^2-M(i,1)^2-M(i,2)^2-M(i,3)^2)/2;
end

D=[B'*B;A']           % 將平面作爲限制條件加入方程組
L3=[B'*L2;1]

C=inv(D'*D)*D'*L3   % 求解空間圓圓心座標

radius=0;
for i=1:num
    tmp=M(i,:)-C';
    radius=radius+sqrt(tmp(1)^2+tmp(2)^2+tmp(3)^2);
end
r=radius/num            %  空間圓擬合半徑

figure
h1=plot3(M(:,1),M(:,2),M(:,3),'*');
set(gca,'xlim',[11.4 11.7]);


%%%%   繪製空間圓  %%%%
n=A;
c=C;

theta=(0:2*pi/100:2*pi)';    %  theta角從0到2*pi
a=cross(n,[1 0 0]);          %  n與i叉乘,求取a向量
if ~any(a)                   %  如果a爲零向量,將n與j叉乘
    a=cross(n,[0 1 0]);
end
b=cross(n,a);      % 求取b向量
a=a/norm(a);       % 單位化a向量
b=b/norm(b);       % 單位化b向量

c1=c(1)*ones(size(theta,1),1);
c2=c(2)*ones(size(theta,1),1);
c3=c(3)*ones(size(theta,1),1);

x=c1+r*a(1)*cos(theta)+r*b(1)*sin(theta);  % 圓上各點的x座標
y=c2+r*a(2)*cos(theta)+r*b(2)*sin(theta);  % 圓上各點的y座標
z=c3+r*a(3)*cos(theta)+r*b(3)*sin(theta);  % 圓上各點的z座標

hold on;
h2=plot3(x,y,z,'-r');
xlabel('x軸')
ylabel('y軸')
zlabel('z軸')
legend([h1 h2],'控制點','擬合圓');
grid on

程序運行結果

1.  控制點無誤差空間圓擬合,2 控制點含誤差空間圓擬合

 

 

參考文獻:

[1] 李英碩,楊帆,袁兆奎. 空間圓形擬合檢測新方法. 測繪科學. 2013, 38(6): 147-148.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章