fitting a curve (3D) to pointcloud data
23 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Rupert Schaffarz
am 17 Mai 2019
Beantwortet: Amir Suhail
am 1 Jan. 2020
Hello
I have a pointcloud from which I want to extract the border of a street. I have manually created sampling datapoints using the datacursor.
Now I have a list of x, y, z points from which I want to derive a curve (road boarder).
What is the best method of making such a curve given a list of x y z points. It should be smooth.
Thanks for any help!
0 Kommentare
Akzeptierte Antwort
Are Mjaavatten
am 20 Mai 2019
Assuming that the points are listed in sequence along your curve, you can express x, y, and z as functions of the (approximate) position along the curve, using splines. To illustrate and test, I first generate a set of points to represent your point cloud. The points are randomly distributed along a 3D curve:
t = sort(rand(50,1))*10;
x = sin(t);
y = cos(1.7*t);
z = sin(t*0.22);
plot3(x,y,z,'*')
grid on
Of course, you do not know the parameter t, so we must create a parameter vector s, based on the euclidean distance between points:
s = zeros(size(x));
for i = 2:length(x)
s(i) = s(i-1) + sqrt((x(i)-x(i-1))^2+(y(i)-y(i-1))^2+(z(i)-z(i-1))^2);
end
Now you have x, y, and z as functions of s, and you can generate splines passing through the points:
ss = linspace(0,s(end),100);
xx = spline(s,x,ss);
yy = spline(s,y,ss);
zz = spline(s,z,ss);
hold on
plot3(xx,yy,zz)
hold off
If there is noise in your data and you want to smooth the curve, consider using polyfit / polyval instead of spline.
If your points are not in sequence, the problem gets MUCH harder to automate, and I recommend that you sequence them manually.
5 Kommentare
Are Mjaavatten
am 20 Mai 2019
Bearbeitet: Are Mjaavatten
am 20 Mai 2019
This will work relativey well with your data:
rb = load('road_boarders');
% Right border:
x = rb.right_border_sorted(:,1);
y = rb.right_border_sorted(:,2);
z = rb.right_border_sorted(:,3);
s = zeros(size(x));
for i = 2:length(x)
s(i) = s(i-1) + sqrt((x(i)-x(i-1))^2+(y(i)-y(i-1))^2+(z(i)-z(i-1))^2);
end
px = polyfit(s,x,3);
py = polyfit(s,y,2);
pz = polyfit(s,z,2);
ss = linspace(0,s(end),100);
% Inspect fit:
figure(1);
subplot(3,1,1);plot(s,x,ss,polyval(px,ss));
subplot(3,1,2);plot(s,y,ss,polyval(py,ss));
subplot(3,1,3);plot(s,z,ss,polyval(pz,ss));
figure(2)
plot3(x,y,z,'.r',polyval(px,ss),polyval(py,ss),polyval(pz,ss),'b')
grid on
% Left border:
x = rb.left_border_subset_sorted(:,1);
y = rb.left_border_subset_sorted(:,2);
z = rb.left_border_subset_sorted(:,3);
s = zeros(size(x));
for i = 2:length(x)
s(i) = s(i-1) + sqrt((x(i)-x(i-1))^2+(y(i)-y(i-1))^2+(z(i)-z(i-1))^2);
end
px = polyfit(s,x,3);
py = polyfit(s,y,2);
pz = polyfit(s,z,2);
ss = linspace(0,s(end),100);
figure(3);
subplot(3,1,1);plot(s,x,ss,polyval(px,ss));
subplot(3,1,2);plot(s,y,ss,polyval(py,ss));
subplot(3,1,3);plot(s,z,ss,polyval(pz,ss));
% Both borders in the same plot:
figure(2);
hold on
plot3(x,y,z,'.r',polyval(px,ss),polyval(py,ss),polyval(pz,ss),'b')
axis equal
If the road has more curves, you could try with higher-order polynomials. However, this approach is not likely to handle more than one or two turns. The curve fitting and spline toolboxes have functions for generating smoothed splines, which could probably do the job. I cannot test this, as I do not have access to those toolboxes.
Weitere Antworten (3)
Amir Suhail
am 1 Jan. 2020
Hi,
I have similar question. I want to take equdistant points (say N points ) on smooth approximating curve through my data points (x,y,z).
0 Kommentare
jigsaw
am 21 Sep. 2019
Are Mjaavatten's answer works great for me. The following lines can be modified a bit to be more concise. Replace the
s = zeros(size(x));
for i = 2:length(x)
s(i) = s(i-1) + sqrt((x(i)-x(i-1))^2+(y(i)-y(i-1))^2+(z(i)-z(i-1))^2);
end
with
s = [0;cumsum(flip(sqrt((x(end:-1:2)-x(end-1:-1:1)).^2+(y(end:-1:2)-y(end-1:-1:1)).^2+(z(end:-1:2)-z(end-1:-1:1)).^2)))];
1 Kommentar
deb.P
am 8 Nov. 2019
i have a question: i have fitted a curve to my 3 variable data set according to the code Are Mjaavatten has mentioned. Now i want to know what is the equation of the fitted curve.
1 Kommentar
Are Mjaavatten
am 9 Nov. 2019
If you have used the polyfit version, px, py and pz give the coefficients for the fitted polynomials in s. See the docmentation for polyfit for details.
If you used spline, the expressions are piecewise cubic spline polynomials. Se the documentation for spline for details.
Siehe auch
Kategorien
Mehr zu Vehicle Scenarios finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!