文章目录
- Compute Projective Transformations
- 仿射变换和单应矩阵
- 投影变换又被称作Collineation(共线)或者Homography(单应)。
- Projective Transformations and Vanishing Points
- Cross Ratios and Single View Metrology
- 投影变换exercise
Compute Projective Transformations
参考: https://www.cnblogs.com/houkai/p/6660272.html
介绍基本的图形变换,仿射变换和投影变换的内容和关系。
仿射变换和单应矩阵
首先明确:二者的应用场景相同,都是针对二维图片的变换。
- 仿射变换affine是透视变换的子集;
- 透视变换是通过homography单应矩阵实现的。
从数学的角度,homography即H阵,是一个秩为3的可逆矩阵:
仿射矩阵是:
由于第三行没有未知数,仿射矩阵最常用的是两行三列的形式。计算H阵需要4对不共线点,计算仿射阵只需要3对不共线的点。
通常会才用RANSAC方法从多对匹配点中计算得到精确、鲁棒的结果。affine一般比homography更稳定一些,所以可以先计算affine,然后再用affine作为homography的初始值,进行非线性优化。
仿射变换的实际意义
仿射变换在图形中的变换包括:平移、缩放、旋转、斜切及它们的组合形式。
- 这些变换的特点是:平行关系和线段的长度比例保持不变。
相关公式请看:https://www.cnblogs.com/houkai/p/6660272.html
透视投影变换的实际意义
透视变换的矩阵形式:
这个变换看似是很随意的,变化的可能性也是非常多。但投影变化具有其明确的意义:共面点成像。
回顾相机模型——透视投影(Perspective Projection)是最常用的成像模型
参考:https://www.cnblogs.com/houkai/p/6363135.html
摄像机是三维空间物体与二维图像之间的一种映射。成像模型就是三维空间物体到二维视平面的投影关系。
透视投影(Perspective Projection)是最常用的成像模型,可以用针孔成像模型来近似表示。透视投影成像模型的特点是所有来自场景的光线均通过一个投影中心,它对应于透镜的中心,经过投影中心且垂直于图像平面(成像平面)的直线称为投影轴或光轴。
中心投影可以非常简单地表示成齐次坐标之间的线性映射。
其中K为3*4的摄像机投影矩阵。
像机坐标系和世界坐标系可以通过旋转和平移相联系
R是摄像机相对于世界坐标系的旋转矩阵,C表示位移。令 t=-RC 得:
摄像机模型可表示为:
上述推导的摄像机模型是假定图像坐标在两个轴向上有等尺度的欧式坐标。但CCD摄像机的像素可能不是正方形。如果图像坐标以像素来测量,那么需要在每个方向上引入非等量尺度因子。
其中 αx=f∗mx、αy=f∗my,m分别表示在x和y方向上图像坐标单位距离的像素数, (u0,v0) 表示像素量纲上图像的原点。
- 摄像机模型的参数
x=P*X
P=K*[R|t] - K是内参,R和t成为外参。此处
大写X
是世界坐标系下的位置。
内外参数
P有10个*度,3个来自R,3个来自t,4个是K中的内参。另外,由于P为3*4的不可逆矩阵,在已知P的情况下,为了得到空间点的三维世界坐标,就必须有两个或更多的相机构成的视觉系统模型才能实现。
旋转矩阵,平移矩阵
最终得到的3*3的矩阵,称之为“Homography矩阵”,该矩阵是可逆的。
投影变换又被称作Collineation(共线)或者Homography(单应)。
一个平面的透视投影(如相机拍摄的相片)本质上就是一个投影变换,投影变换定义如下:
A是一个3×3的可逆矩阵变换。
投影变换的重要性质有:保留incidence、保共线(preservation of collinearity)、保平行(preservation of concurrency)。
直线在投影变换下的变换:
设p’=Ap,带回直线方程即可得到第二个式子,那么按照第一个式子直线方程的形式对应,就可以得到l’。这里l为直线方程的系数构成的向量,p为直线上的某点。
投影变换矩阵的计算
至少需要4个对应点即可计算投影变换。简单来说就是利用三个非共线的点确定变换矩阵的“样子”(哪些元素非0,哪些元素是0),再用最后一个点确定非零元素的值。
对于两张影像上不知道真实坐标,只知道像素坐标的情况,如何计算两张影像间的投影变换呢?
- 两个不同位置的相机,共面点对应有两个单应矩阵H1和H2
简单来说就是构建虚拟坐标点,先求出虚拟点到第一张影像的投影变换,再求出虚拟点到第二张影像的投影变换,最后对两个运动代数方法合并两个变换,如下图中的第三个式子,即可得到两张影像间的变换了。
Projective Transformations and Vanishing Points
Cross Ratios and Single View Metrology
交比 (Cross-ratio)
说明数学上,复平面上四点的交比是 。 这个定义可以连续延拓至整个黎曼球面,即复平面加上无穷远点。 一般来说,交比可以定义在射影直线。在任何仿射坐标卡中,交比由上式给出。交比是射影几何的不变量,就是说射影变换保持交比不变。 *
在射影几何中, 假设直线 ℓ 上有四个点 A,B,C,D. 它们的坐标(在 ℓ 上的坐标)分别是 a,b,c,d. 则定义这四个点的交比是
性质:交比是射影变换不变量.
在平行投影中线段中点会保留,但在透视投影中则不会保留。那么对于一个投影变换而言,保持不变的是Cross-Ratio,交比。交比由一条直线上的四个点来定义。
图片测量:
而当交比的某个点位于无穷远处时,交比可以简化:
换句话说,如果我们已经知道了两个方向上的交比,那么我们就可以根据交比推算出两个灭点,连接灭点即可得到地平线。
投影变换exercise
对于此任务,提供了足球比赛视频序列中的图像,以及每个图像中球门的角和徽标的图像。 任务是,对于视频序列中的每个图像,计算徽标和目标之间的单应性,然后将目标点扭曲到徽标中的目标上,以生成徽标在视频帧上的投影
%在video_pts定义的多边形内找到视频帧中的所有点
[ interior_pts ] = calculate_interior_pts(size(video_imgs{i}), video_pts(:,:,test_images(i)));
est_homography.m
求取坐标点之间的单应变换矩阵
% est_homography estimates the homography to transform each of the video_pts into the logo_pts
% Inputs:
% video_pts: a 4x2 matrix of corner points in the video
% logo_pts: a 4x2 matrix of logo points that correspond to video_pts
% Outputs:
% H: a 3x3 homography matrix such that logo_pts ~ H*video_pts
[ H ] = est_homography(video_pts, logo_pts);
est_homography.m
function [ H ] = est_homography(video_pts, logo_pts)
H = [];
A=[];
len = size(video_pts);
for i = 1:len(1)
x1 = video_pts(i,1);
x2 = video_pts(i,2);
x1_ = logo_pts(i,1);
x2_ = logo_pts(i,2);
ax = [-x1,-x2,-1,0,0,0,x1*x1_,x2*x1_,x1_];
ay = [0,0,0,-x1,-x2,-1,x1*x2_,x2*x2_,x2_];
A = [A;ax;ay];
end
[~,~,V]=svd(A);
H=reshape(V(:,end),3,3);
H=H'; % 一定要注意reshape后的矩阵与解向量的对应关系
end
warp_pts.m 根据单应矩阵对坐标点进行变换.
warp_pts计算将video_pts中的点变形为logo_pts内的点的单应性。 然后,它使用该单应性将sample_pts中的点变形为logo_pts图像中的点
function [ warped_pts ] = warp_pts( video_pts, logo_pts, sample_pts)
[ H ] = est_homography(video_pts, logo_pts);
% YOUR CODE HERE
num_rows = size(sample_pts,1);
Ones = ones(1,num_rows);
sample_pts_t = [sample_pts';Ones];
warped_pts = (H*sample_pts_t)'; % 注意这里的变换是logo_pts ~ H*video_pts
for i=1:num_rows
warped_pts(i,:) = warped_pts(i,:)/warped_pts(i,3);
end
warped_pts = warped_pts(:,1:2);
end
inverse_warping.m
inverse_warping拍摄两个图像以及它们之间的一组对应关系,并将img_initial中的所有pts_initial扭曲为img_final中的pts_final
然后,我们可以使用对应关系(ximage,xlogo)将视频帧(xvideo)中的每个点替换为徽标(xlogo)中的对应点。
projected_imgs{i} = inverse_warping(video_imgs{i} , logo_img, interior_pts, warped_logo_pts);
function [ projected_img ] = inverse_warping( img_final, img_initial, pts_final, pts_initial )
pts_final = ceil(pts_final);
pts_initial = ceil(pts_initial);
ind_final= sub2ind([size(img_final,1), size(img_final,2)],...
pts_final(:,2),...
pts_final(:,1));
ind_initial = sub2ind([size(img_initial,1), size(img_initial,2)],...
pts_initial(:,2),...
pts_initial(:,1));
projected_img = img_final;
for color = 1:3
sub_img_final = img_final(:,:,color);
sub_img_initial = img_initial(:,:,color);
sub_img_final(ind_final) = sub_img_initial(ind_initial)*0.5 + sub_img_final(ind_final)*0.5;%索引值相加
projected_img(:,:,color) = sub_img_final;
end
end
matlab里面的sub2ind怎么用?
在命令窗口输入:A=[4 7 2 9 8;3 9 1 4 3;1 5 9 6 4;8 3 7 1 0]
A =
4 7 2 9 8
3 9 1 4 3
1 5 9 6 4
8 3 7 1 0
则A中每个元素对应的索引如下(MATLAB中数据是按列的方式存储的):
1 5 9 13 17
2 6 10 14 18
3 7 11 15 19
4 8 12 16 20
ind=sub2ind(siz,I,J):siz表示要转换的矩阵的行列数,I是要转换矩阵的行标,J是要转换矩阵的列标。I,J的行列数必须相同。ind为输出参数,其行列数与I,J相同。ind即为索引。
在命令窗口中输入:ind=sub2ind(size(A),[1,2;3,4],[1,1;2,2])
则显示
ind =
1 2
7 8
从运算结果可以看出,在矩阵A中,下标(1,1)的索引值为1,下标(2,1)的索引值为2,下标(3,2)的索引值为7,下标(4,2)的索引值为8