相机参数原理深入剖析 与 实际运用

来源:互联网 发布:微商营销软件 编辑:程序博客网 时间:2024/06/07 07:16


1、相机内参与应用

fx、fy、u0、v0只与摄像机内部参数有关,故称矩阵M1为内参数矩阵

其中fx= f/dX ,fy = f/dY ,分别称为u轴和v轴上的归一化焦距

f是相机的焦距,dX和dY分别表示传感器u轴和v轴上单位像素的尺寸大小,单位为mm/pixel,现代技术下一般二者相等

u0和v0则表示的是光学中心,即摄像机光轴与图像平面的交点,通常位于图像中心处,故其值常取分辨率的一半


现以NiKon D700相机为例进行求解其内参数矩阵:
焦距 f = 35mm   最高分辨率:4256×2832     传感器尺寸:36.0×23.9 mm

根据以上定义可以有:

u0 = 4256/2 = 2128 

v0 = 2832/2 = 1416  

dx = 36.0/4256 (mm/pixel)   

dy = 23.9/2832 (mm/pixel)

fx = f/dx = 4137.8    (f和传感器尺寸都必须是mm才能相除消掉)

fy = f/dy = 4147.3


2、几个不得不知的变换矩阵知识


(1)旋转矩阵是正交矩阵,意味着R的转置=R的逆(注意只是旋转矩阵!!不是合成后的4X4的齐次变换矩阵)

(2)旋转矩阵的逆,等于把这样的一个变化矩阵:以同样的对称轴,反方向(顺时针变逆时针,α变-α)转同样的角度

(3)旋转矩阵相乘的意义:P点按顺序在世界坐标系中先后按R1,R2,R3分别旋转,P点的表示为:R3*R2*R1*P,根据矩阵乘法结合律,这个旋转可以先合成一个

R=R3*R2*R1,表示这个点按照R1 R2 R3分别旋转

(4)我们已知绕世界坐标系X Y Z轴分别旋转的旋转矩阵(我的另一篇博客有)。先把相机放在原点,通过这三个矩阵相乘得到朝向,再进行平移,可以得到把相机移动到任意位置,并拥有任意朝向。所以知道这三个矩阵,完全够用了。

(5)4x4正交矩阵,代表了“一次旋转+一次平移”这么一种变换。

那么,它的逆代表了一种反变换,可以这样理解

a.它的逆作用于变化后的点,会将他变回原来变化前的点。

b.相机位置的变化,相机坐标系下物体的变化,是一组反变化。因此物体变化为 Rt,那么相机变化为Rt的逆,反之亦然,后面有详细解释


3、相机外参与应用


一开始,默认相机在世界坐标系原点,世界坐标系原点想象为matlab或opengl画图程序里默认的(0,0,0)。


如何确定相机朝向?

要先明确,相机朝向,就是投影的方向,就是你把它当成深度的那个方向。

由于投影变换我们总喜欢直接除以Z坐标,所以我们把Z轴的正方向当成相机朝向,而相机位于原点处。

这样直接除以Z坐标就相当于做了投影变换。Z坐标为正时,做了一个变换。Z坐标为负时,物体位于相机后面,判断后舍去。

当然如果你喜欢除以X坐标,那就相当于把X轴当成了相机朝向。

我们用一个常用方式表示一个相机,用两个点构成的向量,即Camera_location 和 Camera_lookat,即相机位于哪点,相机朝向哪个点。


(我们以下的一切相机外参带来的变换,包括相机变换和目标点变换,它们的每一步都是以世界坐标系为参照的。)


相机外参数与相机实际位置的互推?


(1)相机参数表示什么:

相机参数表示空间中的点,怎样平移和旋转到这个相机的坐标系下,而不是直接描述了这个相机怎么移动。相机的运动是与相机外部参数矩阵所描述的运动相反的。


(2)相机参数的作用方式:

我们给定相机的旋转矩阵和平移向量如下,再给定空间中一个点,怎么计算这个点的位置?


我们有两种计算方法,

第一先旋转后平移,运算过程如下


第二,用齐次矩阵一次计算,首先拼接成齐次矩阵


然后计算相乘



这两种计算结果是一样一样,实际进行的操作也是一样的。也就是说,第二种运算拆解出来,就是先旋转后平移的方式。


(3)怎么样由相机参数推知相机位置?

我们刚才提到,相机的运动是相机外部参数矩阵所描述的运动相反的。

根据上面两种方法,我们进行计算相机参数

第一种,分解计算:

ok不推倒了,因为下面的公式我也是试验出来的。

要分解计算,先计算相机沿R所描述的旋转轴反方向旋转,一样的度数的对应的旋转矩阵是什么,假设为R',(这个R'=R的逆=R的转置,因为R是正交矩阵)

旋转后,相机的位置和朝向分别为:


其中,Vstart和Vto分别是,相机原来的位置,和相机原来看向的点,R'是R的逆,t就是t


第二种,齐次矩阵


也就是给定齐次矩阵形式的相机参数,想知道相机在哪个位置,直接求逆即可!

由于相机初始时都是位于(0,0,0),望向(0,0,1),所以可以直接带入这俩值。


(4)如何根据实际位置来写出变换矩阵?

第一,首先确定相机初始位置。然后,确定相机初始朝向,为了方便起见我们将Z正方向作为相机朝向。

初始状态,相机未经任何平移和旋转,相机是和世界坐标系平行的,也就是说,相机位于(0,0,0)相机朝向z轴正方向。

我们确定一个旋转R,可以使世界坐标系的Z轴正方向转到一个其他方向,这个方向就是新的相机朝向。

也就是:看世界坐标系的Z轴!把Z轴转到哪个方向,相机就朝着哪个方向!


我们想让相机旋转一个矩阵Rc,然后再平移一个矩阵Tc。那么推断相机参数的步骤为:

(1)把Rc和Tc写成齐次的形式

(2)求这个齐次矩阵的逆矩阵inv(R)

(3)这个矩阵的左上3*3是相机的旋转参数,右边一列的1~3行是相机的平移参数


多个相机旋转的叠加,相机先旋转Rc1,再旋转Rc2,最后旋转Rc3(每次都是按照世界坐标系下的轴为参考系旋转),然后平移Tc,那么推断相机外参数步骤为:

(1)倒着把旋转矩阵相乘,就相当于旋转矩阵叠加,Rc=Rc3*Rc2*Rc1

(2)把Rc和Tc写成齐次的形式....一切同上



4、总结


对于一个空间中的点(Xw,Yw,Zw),如何得一步步得到像素坐标?

(1)写成齐次式,先左乘以M2(即相机外参数的齐次矩阵,完成平移和旋转),得到相机坐标系下的三维点

(2)再左乘以M1(转换到照片坐标系,附加焦距的影响,相当于把像平面的中心点移动到左上角),得到的(X,Y,Z) 再除同时以Zc (进行一个投影变换),得到的数字再舍去小数或四舍五入,就可以得空间中这个点在照片里对应的像素是哪个。


对于知道相机变化的R和T,如何求相机参数?


对于知道了相机的参数,如何求相机位置?




Reference

http://blog.csdn.net/hjchjc520/article/details/4133515

0 0
原创粉丝点击