对三维点集的归一化变换
Posted 枯萎的海风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对三维点集的归一化变换相关的知识,希望对你有一定的参考价值。
1. 前言
昨天处理实验室的数据,处理了整整一天, 都没有出来理想的结果, 后来调试发现, 出现了两个问题:
1. 非线性优化中传入的计算参数传错了。
2. 程序中使用各项同性的归一化方法出来的结果, 比非各项同性归一化出来的结果明显要好。
2. 归一化变换
在计算 2D 单应矩阵 H 的时候, 一定存在某些坐标系表示的方式明显优于其他坐标系, 对于3D 空间中的数据变化计算他们之间的 H=(R0TT1) 也有类似的特性, 我们下面按照2D 空间变化进行讨论。
2.1 各向同性缩放 2D
- 每幅图像中的坐标进行平移, 使得点集的形心移动至原点
- 对坐标系进行缩放, 使得点中
x=(x,y,w)T
中的
x
,
y , w 总体上有一样的平均值, 选用一个各向同性的缩放因子, 使得一个点的 坐标等量缩放, 我们令 平均点为(1,1,1)T , 此时缩放因子使得x 到 原点距离为 2√ 。 同理, 如果是3D 点, 平均点应该为 (1,1,1,1)T , 此时, x 到原点的距离应该为 (√3)
2.2 归一化变换的意义
数据归一化, 可以提高结果的精度, 同时, 归一化算法对于任何尺度缩放和坐标原点的选择都是不变的。
我们可以这样去理解: 归一化为测量数据选择了有效的标准坐标系, 预先消除了坐标变换的影响。因此, 在做类似DLT 的相关运算的时候, 代数最小化的过程其实是在一个固定的标准坐标系下进行的, 从而, DLT 算法实际上关于相似变换是不变的。
数据归一化的过程在类似 DLT 的算法中的效果是实质性的, 不能不要视他为可有可无的。
2.3 非各向同性缩放
理论上, 我们也可以进行非各向同性的归一化方法, 效果是不会比各向同性的缩放有显著提高。可是,我们这里的效果不是提高了, 而是下降了, 鉴于这个结果, 我们还是最好就采用各项同性的归一化方法好了。
2.4 归一化变换code
%% 实验室师兄的版本
function [T] = normalize(w)
% 变换目标:中心在原点且到原点的平均距离为sqrt(3)
if size(w,1)<size(w,2)
w = w';
end
t = -mean(w(:,1:3),1);
w = w(:,1:3) + repmat(t,[size(w,1),1]);
dis = mean(sqrt(w(:,1).*w(:,1)+w(:,2).*w(:,2)+w(:,3).*w(:,3)));
v = sqrt(3)/dis;
t = t'*v;
T = [eye(3)*v,t];
T = [T;0,0,0,1];
end
%% normalize A 我的版本
function [T] = normalize(A)
assert(size(A, 1) == 4, 'A should be 4 x n')
mean_A = mean(A,2);
remain = A - repmat(mean_A, [1, size(A, 2)]);
remain_pt = remain(1:3, :);
dis = mean(sqrt(remain_pt(1, :).*remain_pt(1, :) + remain_pt(2, :).*remain_pt(2, :) + remain_pt(3, :).*remain_pt(3, :)));
diag_diag_T_A = repmat(sqrt(3)/dis, [3, 1]);
T_A = diag([diag_diag_T_A ;1])*...
[1 0 0 -mean_A(1)
0 1 0 -mean_A(2)
0 0 1 -mean_A(3)
0 0 0 1];
end
以上是关于对三维点集的归一化变换的主要内容,如果未能解决你的问题,请参考以下文章