Matlab计算3D相似度转换.适用于3D的fitgeotrans [英] Matlab calculate 3D similarity transformation. fitgeotrans for 3D
问题描述
如何在MatLab中计算3D中4个点之间的相似度转换? 我可以从中计算出变换矩阵
T*X = Xp
,
但是由于点坐标中的小误差,它会给我仿射矩阵.如何使该矩阵适合相似性?我需要类似fitgeotrans
的东西,但是要使用3D
谢谢
假设您在3-dimensional
空间中最多包含3
个点,则@rayryeng的答案是正确的.如果需要变换n-dimensional
空间(m>n
)中的m
点,则首先需要向这些m
点添加m-n
坐标,以使它们存在于m-dimensional
空间中(即n-dimensional
空间中已变换点的坐标即可.
例如,假设您要变换点:
(2 -2 2) -> (-3 5 -4)
(2 3 0) -> (3 4 4)
(-4 -2 5) -> (-4 -1 -2)
(-3 4 1) -> (4 0 5)
(5 -4 0) -> (-3 -2 -3)
请注意,您具有n=3
维的m=5
点.因此,您需要向这些点添加坐标,以使它们成为n=m=5
维,然后应用@rayryeng描述的过程.
我已经实现了一个功能(请在下面找到).您只需要组织这些点,以使每个源点都是矩阵u
中的一列,而每个目标点就是矩阵v
中的一列.矩阵u
和v
将分别是3
×5
.
警告:
-
该函数中的矩阵A可能需要大量内存用于
nP
的许多点,因为它具有nP^4
个元素. -
要解决此问题,对于平方矩阵
u
和v
,您可以简单地在MATLAB表示法中使用T=v*inv(u)
或T=v/u
. -
代码运行速度可能很慢...
在MATLAB中:
u = [2 2 -4 -3 5;-2 3 -2 4 -4;2 0 5 1 0]; % setting the set of source points
v = [-3 3 -4 4 -3;5 4 -1 0 -2;-4 4 -2 5 -3]; % setting the set of target points
T = findLinearTransformation(u,v); % calculating the transformation
您可以通过以下方式验证T
是正确的:
I = eye(5);
uu = [u;I((3+1):5,1:5)]; % filling-up the matrix of source points so that you have 5-d points
w = T*uu; % calculating target points
w = w(1:3,1:5); % recovering the 3-d points
w - v % w should match v ... notice that the error between w and v is really small
计算转换矩阵的函数:
function [T,A] = findLinearTransformation(u,v)
% finds a matrix T (nP X nP) such that T * u(:,i) = v(:,i)
% u(:,i) and v(:,i) are n-dim col vectors; the amount of col vectors in u and v must match (and are equal to nP)
%
if any(size(u) ~= size(v))
error('findLinearTransform:u','u and v must be the same shape and size n-dim vectors');
end
[n,nP] = size(u); % n -> dimensionality; nP -> number of points to be transformed
if nP > n % if the number of points to be transform exceeds the dimensionality of points
I = eye(nP);
u = [u;I((n+1):nP,1:nP)]; % then fill up the points to be transformed with the identity matrix
v = [v;I((n+1):nP,1:nP)]; % as well as the transformed points
[n,nP] = size(u);
end
A = zeros(nP*n,n*n);
for k = 1:nP
for i = ((k-1)*n+1):(k*n)
A(i,mod((((i-1)*n+1):(i*n))-1,n*n) + 1) = u(:,k)';
end
end
v = v(:);
T = reshape(A\v, n, n).';
end
How can I calculate in MatLab similarity transformation between 4 points in 3D? I can calculate transform matrix from
T*X = Xp
,
but it will give me affine matrix due to small errors in points coordinates. How can I fit that matrix to similarity one? I need something like fitgeotrans
, but in 3D
Thanks
The answer by @rayryeng is correct, given that you have a set of up to 3
points in a 3-dimensional
space. If you need to transform m
points in n-dimensional
space (m>n
), then you first need to add m-n
coordinates to these m
points such that they exist in m-dimensional
space (i.e. the a
matrix in @rayryeng becomes a square matrix)... Then the procedure described by @rayryeng will give you the exact transformation of points, you then just need to select only the coordinates of the transformed points in the original n-dimensional
space.
As an example, say you want to transform the points:
(2 -2 2) -> (-3 5 -4)
(2 3 0) -> (3 4 4)
(-4 -2 5) -> (-4 -1 -2)
(-3 4 1) -> (4 0 5)
(5 -4 0) -> (-3 -2 -3)
Notice that you have m=5
points which are n=3
-dimensional. So you need to add coordinates to these points such that they are n=m=5
-dimensional, and then apply the procedure described by @rayryeng.
I have implemented a function that does that (find it below). You just need to organize the points such that each of the source-points is a column in a matrix u
, and each of the target points is a column in a matrix v
. The matrices u
and v
are going to be, thus, 3
by 5
each.
WARNING:
the matrix A in the function may require A LOT of memory for moderately many points
nP
, because it hasnP^4
elements.To overcome this, for square matrices
u
andv
, you can simply useT=v*inv(u)
orT=v/u
in MATLAB notation.The code may run very slowly...
In MATLAB:
u = [2 2 -4 -3 5;-2 3 -2 4 -4;2 0 5 1 0]; % setting the set of source points
v = [-3 3 -4 4 -3;5 4 -1 0 -2;-4 4 -2 5 -3]; % setting the set of target points
T = findLinearTransformation(u,v); % calculating the transformation
You can verify that T
is correct by:
I = eye(5);
uu = [u;I((3+1):5,1:5)]; % filling-up the matrix of source points so that you have 5-d points
w = T*uu; % calculating target points
w = w(1:3,1:5); % recovering the 3-d points
w - v % w should match v ... notice that the error between w and v is really small
The function that calculates the transformation matrix:
function [T,A] = findLinearTransformation(u,v)
% finds a matrix T (nP X nP) such that T * u(:,i) = v(:,i)
% u(:,i) and v(:,i) are n-dim col vectors; the amount of col vectors in u and v must match (and are equal to nP)
%
if any(size(u) ~= size(v))
error('findLinearTransform:u','u and v must be the same shape and size n-dim vectors');
end
[n,nP] = size(u); % n -> dimensionality; nP -> number of points to be transformed
if nP > n % if the number of points to be transform exceeds the dimensionality of points
I = eye(nP);
u = [u;I((n+1):nP,1:nP)]; % then fill up the points to be transformed with the identity matrix
v = [v;I((n+1):nP,1:nP)]; % as well as the transformed points
[n,nP] = size(u);
end
A = zeros(nP*n,n*n);
for k = 1:nP
for i = ((k-1)*n+1):(k*n)
A(i,mod((((i-1)*n+1):(i*n))-1,n*n) + 1) = u(:,k)';
end
end
v = v(:);
T = reshape(A\v, n, n).';
end
这篇关于Matlab计算3D相似度转换.适用于3D的fitgeotrans的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!