SLAM14讲学习笔记(二)相机模型总结

158
0
2020年11月5日 09时05分

相机模型这节的内容是最最基础重要的内容。再次回顾依然有所收获。但这一章的内容其实并不多。但是容易混淆。


1.一共涉及到的坐标系有四个:

第一,世界坐标系;

第二,相机坐标系;

第三,归一化相机坐标系;

第四,像素坐标系。

 

世界坐标系意如其名,不多解释;而相机坐标系是依据相机的光心(也就是小孔成像的那个小孔)建立起的坐标系。

而归一化相机坐标系,是相机坐标系下的(x,y,z)三个值除以第三维,把z归为1的一个坐标系。关于这点高翔的书里讲的有点含糊,不清楚。实际上的归一化相机坐标系并不存在,它只是一个理念上的坐标系;

 

实际顺序应当是:

物理成像平面     (—-间距为焦距f—-)     相机光心所在平面      (—-间距为z—-)    物体

物体经过光心投影至物理成像平面,会形成一个倒像。为了直观表示和观察,就把物理成像平面顺着光心所在平面对称到物体一侧,即:

物理成像平面    (—-间距为焦距f—-)    相机光心所在平面   (—-间距为焦距f—-)   物理成像对称平面    (—-间距为z—-)      物体

 

相机坐标系应当就是相机光心所在平面;

(1) 世界坐标系下的一个坐标,左乘外参T(也就是变换矩阵T或者是先乘R再加t),就转化到了相机坐标系下的坐标;

 

那么相机坐标系下的坐标如何转化到像素坐标系呢?

首先,像素坐标系只有x,y,而相机坐标系有三个值,xyz,多出来的一个深度值z不能直接删掉,它起到了一个尺度的作用。不然一个物体在相机坐标系下(5000,4000,1000)处,直接删掉最后的1000,该物体在像素坐标系下变成了(5000,4000),你的照片哪有这么大?根据相似三角形,成像平面距离光心距离为f,物体距离光心距离为z,那么物体在相机坐标系下的x,在成像平面上的x就是X,x/X=z/f,那么X就是f*x/z。

 

因此,归一化相机坐标系,我认为是起到了一个媒介和尺度的作用。(也就是说它在光心所在平面右侧,距离光心平面间距为1,而真正的成像平面,应该可以叫做归“f”化相机坐标系

(2) 相机坐标系下的坐标,除以z,就得到了归一化相机坐标系下的坐标。

 

(3)关于内参的含义:

成像平面,我把它理解为我的相机胶片,最后是要成像在“成像平面”上的。这个成像平面,应该就是在上述“顺序”最左边的那个真实的“物理成像平面”上。但是由于最左边的物理成像平面是倒着的,因此可以理解成是它投影到右边那个对称平面上。

注意成像平面并不等于“像素坐标系”,它们在同一个平面,但是直接差了一个“缩放”和“平移”。设在u轴上缩放了α倍,v轴上缩放了β倍,原点平移了cx,cy。(在图像的右上角)

因此从相机坐标系到像素坐标系,需要先把它统一归一到“归一化相机坐标系”,然后直接从“归一化相机坐标系”变换到“像素坐标系”,其中就涉及到了三个变换,第一,像素坐标系实际是在成像平面上,也就是说从归一化相机坐标系上需要先归到”归f化相机坐标系“(也就是成像平面);第二,到了成像平面以后,还要再缩放α,β;第三,再平移原点;

把f和αβ结合起来:

fx=αf,fy=βf;

内参矩阵=

fx,0,cx

0,fy,cy

0,0,1

所以,在(2)以后,左乘内参矩阵K,就变到了像素坐标系下了。

 

 

2.相机的内参应该是厂家会提供的,如果没有提供,就应当自己去标定。点击这里-Opencv张正友相机标定傻瓜教程附代码

另外一个是相机畸变系数,很多人会把它混淆在内参里面。因为它也是相机固有特性,是厂家应该提供的。而在相关理论处理的时候,虽然用了内参K,但是是默认是没有畸变的。畸变并没有包括在内参里面。

畸变有两种:径向畸变和切向畸变。

径向畸变有桶形畸变和枕形畸变。这是因为透镜形状不规律导致的;

切向畸变是因为透镜和成像平面不能严格平行;

如果考虑畸变的话,在投影到归一化坐标系后,应该先纠正,再左乘内参。

 

 

3.双目相机模型:

这个也是数学的三角形理论,画图很麻烦,因此看书就行了。

几个概念:

基线b:两个相机光心之间的水平距离(当然也没有垂直距离,应该是放到一个水平线上的)

视差d:同一个物体的点在两个像素坐标系下的横坐标之差;

z=fb/d,这样来算物体的深度z;

f是焦距,用户没得改;d是测量结果,是实际情况不以人的意志为转移;因此能改的就是一个b,所以双目的深度存在一个理论上的最大值,由fb确定;如果希望能测到的最大距离远一些,就把基线拉长一些。

这个东西的问题在于视差d不太好确定,图像纹理变化丰富的地方,才能计算视差。

 

4.Opencv的表示形式:

一句话总结吧:原点在左上角,横着的是x轴,竖着的是y轴,一个[x][y]点,opencv表示为:

 

image_pixel=image[y][x]

 

也就是说,把图像当成一个表格,用几行几列表示那个点。

 

发表评论

后才能评论