How to rotate or align point cloud ?
31 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Lyhour Chhay
el 25 de Dic. de 2021
Comentada: Lyhour Chhay
el 27 de Dic. de 2021
Excuse me everyone! I have point cloud as shown in the figure. I want to rotate to the horizontal plane. The rotation point is the middle. How can I do it ? Thank you very much.![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/844035/image.jpeg)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/844035/image.jpeg)
0 comentarios
Respuesta aceptada
Matt J
el 25 de Dic. de 2021
Editada: Matt J
el 26 de Dic. de 2021
Since your point cloud is is not perfectly coplanar, you will need to fit a plane to it in order to determine the necessary rotation. You can do that with planarFit() from this downloadable package:
pfit=planarFit(plyRoi.Location.');
Having done this, you can also use some of the Hidden methods of the pfit object to do the rotation:
XYZ=plyRoi.Location;
x0=mean(XYZ);
R=pfit.vecrot(pfit.normal,[0,0,1]); %compute 3x3 rotation matrix
result=pointCloud((XYZ-x0)*R.'+x0); %rotated point cloud
14 comentarios
Matt J
el 26 de Dic. de 2021
Editada: Matt J
el 26 de Dic. de 2021
Here is the code I used, and the results I obtained,
XYZ=plyRoi.Location;
pfit=planarFit(XYZ');
x0=mean(XYZ);
R=pfit.vecrot(pfit.normal,[0,0,1]); %compute 3x3 rotation matrix
result=num2cell((XYZ-x0)*R'+x0,1); %rotated point cloud
[hF,h1]=plot(pfit); hold on
h2=scatter3(result{:},'filled','MarkerFaceColor','g'); hold off
axis(0.07*[-1,1,-1,1,-1,0])
view(-25,3)
legend([h1,hF,h2],'Old Cloud','Plane Fit','New Cloud',...
'location','north')
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/844615/image.png)
Más respuestas (1)
Image Analyst
el 25 de Dic. de 2021
You forgot to attach your data, which would have made it easier.
So I'd guess at something like
% Fit a line through the data.
coefficients = polyfit(x, y, 1);
% Then get the mean y
meany = mean(y);
% Get a fitted y
fittedy = polyval(coefficients, x);
% Then subtract the fitted values and add the vertical offset.
rotatedy = y - fittedy + meany;
plot(x, rotatedy, '.', 'MarkerSize', 10);
9 comentarios
Ver también
Categorías
Más información sobre Surface and Mesh Plots en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!