ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

学习记录四

2021-12-11 18:02:26  阅读:185  来源: 互联网

标签:src warpMatrix 记录 学习 畸变 坐标 图像 坐标系


相机模型


图像研究首先要知道图像是怎么来的,也就是现实生活中的物体是咋转换成数字图像的,即相机的成像原理。

相机模型

相机模型存在四个坐标系:世界坐标系、摄像机坐标系、图像物理坐标系和图像像素坐标系。相机成像的原理其实就是将物体的世界坐标–>摄像机坐标–>图像物理坐标–>图像像素坐标。
在这里插入图片描述
世界坐标系:是客观三维世界的绝对坐标系,也称客观坐标系。就是物体在真实世界中的坐标。 世界坐标系是随着物体的大小和位置变化的,单位是长度单位。
相机坐标系:以相机的光心为坐标系的原点,以平行于图像的x和y方向为x轴和y轴,z轴和光轴平行,x, y,z互相垂直,单位是长度单位。
图像物理坐标系:以主光轴和图像平面交点为坐标原点,x’和y’方向如图所示,单位是长度单位。
图像像素坐标系:以图像的顶点为坐标原点,u和v方向平行于x’和y’方向,单位是以像素计

世界坐标系到摄像机坐标系

这两种坐标系都是三维的,因此在这里涉及到坐标系的转换,也就是欧式变换。公式是a’=Ra+t,R为旋转矩阵,t为平移矩阵,a为原坐标,a’为变换后的坐标。用齐次坐标形式可以将a’=Ra+t表示为:
在这里插入图片描述
多次连续旋转和平移:假设我们将向量a进行了两次欧氏变换,旋转和平移分别为R1, t1 和 R2, t2,分别得到:b = R1a + t1, c = R2b + t2 进而c = R2*(R1*a + t1) + t2。齐次坐标可以表示为:
在这里插入图片描述
这样表示后,每多一次变换,无非就是在右端项左乘一个Tn。由上述理论就能将世界坐标到摄像机坐标的关系表示为:
在这里插入图片描述
其中X,Y,Z为世界坐标,Xc,Yc,Zc为摄像机坐标。

摄像机坐标系到图像物理坐标系

这是一个将三维坐标转为二维坐标的过程,主要运用相似三角形对应边成比例的原理。如下图:
在这里插入图片描述
左图为相机模型示意图的俯视图,由相似三角形原理可知: f / Z c = X ′ / X c f/Zc = X'/Xc f/Zc=X′/Xc;同理从侧面看右图可以得到 f / Z c = Y ′ / Y c f/Zc = Y'/Yc f/Zc=Y′/Yc。即 Z c X ′ = f X c ZcX' = fXc ZcX′=fXc, Z c Y ′ = f Y c ZcY' = fYc ZcY′=fYc,写成矩阵形式如下:
在这里插入图片描述

图像物理坐标系到图像像素坐标系

平面示意图如下,物理坐标系原点o在像素坐标系下的坐标为(u0,v0),一般来说,其值为图像宽高像素个数的一半(如图像为512x512时,o点的坐标为(256,256))。
在这里插入图片描述
我们可以推得点p(x,y)对应的像素坐标为:
在这里插入图片描述
其中dx和dy表示:x方向和y方向的一个像素分别占多少个(可能是小数)长度单位。
上式的齐次坐标形式为:
在这里插入图片描述

相机成像原理

由上述各式我们可以推得摄像机坐标系到图像像素坐标系的关系式如下:
在这里插入图片描述
简单的变量代换过程就不详细展开了。再进一步,世界坐标系到图像像素坐标系的关系式推得:
在这里插入图片描述
这也就是相机的成像原理。

镜头畸变

所谓镜头畸变,就是透镜由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真。镜头的畸变分为径向畸变和切向畸变两类。
在这里插入图片描述

径向畸变

径向畸变就是沿着透镜半径方向分布的畸变,产生原因是光线在远离透镜中心的地方比靠近中心的地方更加弯曲径向。主要包含桶形畸变和枕形畸变两种:
在这里插入图片描述
成像仪光轴中心的畸变为0,沿着镜头半径方向向边缘移动,畸变越来越严重。在真实世界中大概是这样:
在这里插入图片描述畸变的数学模型可以用主点周围的泰勒级数展开式的前几项进行描述,通常使用前两项,即k1和k2,对于畸变很大的镜头,如鱼眼镜头,可以增加使用第三项k3来进行描述,成像仪上某点根据其在径向方向上的分布位置,调节公式为:
在这里插入图片描述
式里(x0,y0)是畸变点在成像仪上的原始位置,(x,y)是畸变较真后新的位置,下图是距离光心不同距离上的点经过透镜径向畸变后点位的偏移示意图,可以看到,距离光心越远,径向位移越大,表示畸变也越大,在光心附近,几乎没有偏移。
在这里插入图片描述

切向畸变

切向畸变产生的原因透镜不完全平行于图像平面,这种现象发生于成像仪被粘贴在摄像机的时候。在真实世界中大概是这样:
在这里插入图片描述
畸变模型可以用两个额外的参数p1和p2来描述:
在这里插入图片描述
下图显示某个透镜的切向畸变示意图,大体上畸变位移相对于左下——右上角的连线是对称的,说明该镜头在垂直于该方向上有一个旋转角度。
在这里插入图片描述

畸变矫正

径向畸变和切向畸变模型中一共有5个畸变参数,在Opencv中他们被排列成一个5*1的矩阵,依次包含k1、k2、p1、p2、k3。这5个参数就是相机标定中需要确定的相机的5个畸变系数。求得这5个参数后,就可以校正由于镜头畸变引起的图像变形失真,下图显示根据镜头畸变系数校正后的效果:
在这里插入图片描述

透视变换

透视变换(Perspective Transformation)是将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。 我们常说的仿射变换是透视变换的一个特例。透视变换可以看做畸变矫正的一种方式,原理其实就是投影,如下图:
在这里插入图片描述
假设有一个光源,将图像从原图像平面投影到新图像平面,右图可以看出两个平面显然不平行,因此得到的图像形状上也会有差异,我们的目的就是让新图像尽可能符合真实世界中的图像。通用的变换公式为:
在这里插入图片描述
x,y是原始带有畸变图片坐标,对应变换后的图片坐标(X’, Y’, Z’)计算如下:
在这里插入图片描述
第一项都除以Z是因为图像是二维的,所以需要将X, Y, Z转化为二维,进一步就能得到第二项表达式,其中所有的a值未知。在这里运用一个初高中解方程的小trick,为了尽量减少未知数个数,令a33=1,展开上面公式,得到一个点的情况:
在这里插入图片描述
其中已知x, y为原图像上的点,X’, Y’为变换后的点。为了解出仿射变换矩阵的值,先找到原图像的4个顶点(x0,y0),(x1,y1),(x2,y2),(x3,y3),以及对应新图像的4个顶点(X’0,Y’0),(X’1,Y’1),(X’2,Y’2),(X’3,Y’3),一共8个点,代入上式得到:
在这里插入图片描述
其中A, B都是已知的,由此可以解出8个a值。具体代码实现如下:

import numpy as np
 
def WarpPerspectiveMatrix(src, dst):
    assert src.shape[0] == dst.shape[0] and src.shape[0] >= 4
    nums = src.shape[0]
    A = np.zeros((2*nums, 8)) # A*warpMatrix=B
    B = np.zeros((2*nums, 1))
    for i in range(0, nums):
        A_i = src[i,:]
        B_i = dst[i,:]
        A[2*i, :] = [A_i[0], A_i[1], 1, 0, 0, 0,
                       -A_i[0]*B_i[0], -A_i[1]*B_i[0]]
        B[2*i] = B_i[0]
        
        A[2*i+1, :] = [0, 0, 0, A_i[0], A_i[1], 1,
                       -A_i[0]*B_i[1], -A_i[1]*B_i[1]]
        B[2*i+1] = B_i[1]
 
    A = np.mat(A)
    #用A.I求出A的逆矩阵,然后与B相乘,求出warpMatrix
    warpMatrix = A.I * B #求出a_11, a_12, a_13, a_21, a_22, a_23, a_31, a_32
    
    #之后为结果的后处理
    warpMatrix = np.array(warpMatrix).T[0]
    warpMatrix = np.insert(warpMatrix, warpMatrix.shape[0], values=1.0, axis=0) #插入a_33 = 1
    warpMatrix = warpMatrix.reshape((3, 3))
    return warpMatrix
 
if __name__ == '__main__':
    print('warpMatrix')
    src = [[10.0, 457.0], [395.0, 291.0], [624.0, 291.0], [1000.0, 457.0]]
    src = np.array(src)
    
    dst = [[46.0, 920.0], [46.0, 100.0], [600.0, 100.0], [600.0, 920.0]]
    dst = np.array(dst)
    
    warpMatrix = WarpPerspectiveMatrix(src, dst)
    print(warpMatrix)

输出:

warpMatrix
[[-5.01338334e-01 -1.35357643e+00  5.82386716e+02]
 [ 1.07391873e-15 -4.84035391e+00  1.38781980e+03]
 [ 3.68359549e-19 -4.14856327e-03  1.00000000e+00]]

由此原图像的每个点经过变换矩阵都可以投影到新图像上。透视变换这个操作在opencv等很多第三方库中都直接有封装,调用接口即可,其内部原理就是上述内容

标签:src,warpMatrix,记录,学习,畸变,坐标,图像,坐标系
来源: https://blog.csdn.net/m0_54902013/article/details/121634167

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有