单应性及透视变换

版权声明:本文为博主原创文章,转载请指明出处。 https://blog.csdn.net/dataningwei/article/details/59108376

1 单应性(Homography)

为了实现逆透视变换,首先要先理解单应性。
平面上某点P,在世界坐标系下和图像坐标系下的坐标分别表示为Mm,则:

sm˜=A[R,t]M˜

其中,s为尺度因子,A为内参矩阵,R,t统称为外参矩阵,将其展开如下:
suv1=A[r1r2r3t]XYZ1
由于在同一平面下,另z=0,—》
suv1=A[r1r2r3t]XY01=A[r1r2t]XY1

H=A[r1r2t],则H为单应性矩阵,sm˜=HM˜
求解推导如下:
这里写图片描述

最少根据四个点,建立8个方程,求解出h。具体的求解方法为利用SVD分解。
具体求解方法可参看张正友文章:
Homography Estimation

2 逆透视

透视变换是利用小孔成像原理,将世界坐标下的物体变换到图像坐标系下,而逆透视变换是其反变换,是已知图像将其变换到世界坐标下。
为了满足单应性使用条件,我们限定变换的所有目标点在世界坐标系下共平面。
基本流程如下:

1 建立图像坐标系和世界坐标系
2. 获取至少4个点对坐标,本示例使用标定板的四个顶点坐标。
3. 根据4个点对计算H单应性矩阵.
4. 生成世界坐标系下的坐标网络
5. 映射至图像坐标系下,获取对应像素值,填充世界坐标系下坐标网络。
世界所坐标系建立如下:
这里写图片描述

先上逆透视结果:
这里写图片描述

nx=330;
ny=360;
% 棋盘格四个在图像上的四个顶点像素坐标
m=[ 434.655350296612    500.590117151691    133.931698403274    168.688463982752;
    196.481734108317    386.841185548903    377.658238152848    179.933135570341;
    1                   1                   1                   1               ];
% 棋盘格在世界坐标系下的坐标(无量纲,不考虑单位)
M=[ 1   nx  nx  1;
    ny  ny  1   1;
    1   1   1   1];
% 根据4个点对,计算单应性矩阵
[Homo,Hnorm,inv_Hnorm] = compute_homography(m,M);

x_l=[-300:nx+100];
y_l=[-300:ny+100];

SX=length(x_l);
SY=length(y_l);

% 生成世界坐标系下坐标(无量纲,不考虑单位)
x_l=x_l'*ones(1,SY);
y_l=ones(SX,1)*y_l;
pts=[x_l(:) y_l(:) ones(SX*SY,1)]';

% 计算所有点对下的映射
XX = Homo*pts;
XX = XX(1:2,:) ./ (ones(2,1)*XX(3,:));
XX=fix(XX+0.5);

%% 像素重映射
out_img=zeros(SX*SY,1);
for i=1:SX*SY
    if XX(1,i)>640 || XX(2,i)>480 || XX(1,i)<1 || XX(2,i) <1
        ;
    else
        out_img(i)=input_img(XX(2,i),XX(1,i));
    end

end

参考:
《A Flexible New Technique for Camera Calibration》

展开阅读全文

没有更多推荐了,返回首页