针孔相机模型成像原理与图像变形矫正教程

相机成像原理与焦距概念

针孔相机的本质就是初中学过的小孔成像,镜头是一个小孔,然后光线透过小孔被感光传感器所捕获。当然以前的相机是通过胶片来捕获光线。虽然各个时代的相机记录图像的技术不一样,但是不变的都是利用小孔成像这个原理来将外面的三维的大图像缩小到一个二维的小照片上。相信你不会对下面这个图陌生,比较初中物理书上必备这个。
针孔相机模型成像原理与图像变形矫正教程_第1张图片
真实图像各个像素点的位置与照片里面的图像的位置对应关系是由下面这个红色的相似三角形所决定。
在这里插入图片描述
相机里面那个小三角形的直角边叫做焦距,经常听到的调焦距对焦就弄的是这个恰当的焦距才能更好的成像。
针孔相机模型成像原理与图像变形矫正教程_第2张图片
现在有个问题了,它是倒立的像,而我们平常看到的照片很正常。这是因为相机自动给我们翻转了图像,最古老的相机它拍照的时候是倒过来的。接下来定量的分析照片上的点与实际图像点之间的长度关系。

针孔相机数学模型

针孔相机模型成像原理与图像变形矫正教程_第3张图片
从这个相似三角形我们可以看到实际物体坐标与它们在相机中的坐标对应关系。注意:物体的坐标是三维,但是照片上的坐标只有2维。 x ′ = − f ∗ ( x d ) x'=-f*(\frac x d) x=f(dx),之所以有个负号是因为他们是倒立的,所以坐标的符号发生变化。由于我们平常接触到的照片并不是倒立的所以照片上的坐标计算公式为 x ′ = f ∗ ( x d ) x'=f*(\frac x d) x=f(dx)。不同相机的焦距f是不一样的,所以这个参数叫做相机的内参。它对于我们根据照片来三维重建原先的物体非常重要。这个相机的内参一般厂家会提供,如果没有那就得我们自己用相机对标定板拍照,然后根据照片来计算出相机的焦距。

我们平常有用的坐标系都是长这样的:
针孔相机模型成像原理与图像变形矫正教程_第4张图片
但是在计算机图像图形领域用的坐标系是长这样的,坐标系原点在相片的左上角:
在这里插入图片描述
我们之前写的 x ′ = − f ∗ ( x d ) x'=-f*(\frac x d) x=f(dx)这个公式,它坐标系原点是和焦点在同一条线上即相片的中心。但是我们存储相片的时候用的坐标系却是计算机图像坐标系。所以我们得把针孔模型的坐标变换到计算机图像坐标系中。这个其实非常简单,因为本质上就是把整个坐标系进行了平移,和翻转了一下。假设原先针孔相机模型的各像素的坐标是[x’,y’],而存储的计算机图像坐标系坐标为[u,v]。
他们之间的对应关系就是平移了一下,翻转了一下。用公式表示就是: u = a x ′ + c x , v = b y ′ + c y u=ax'+c_x,v=by'+c_y u=ax+cx,v=by+cy。然后把 x ′ = f ∗ ( x d ) x'=f*(\frac x d) x=f(dx)代入得到 u = a × f × ( x d ) + c x , v = b × f × ( y d ) + c y u=a×f×(\frac x d)+c_x,v=b×f×(\frac y d)+c_y u=a×f×(dx)+cx,v=b×f×(dy)+cy,我们把x,y前面的系数合并为 u = f x × ( x d ) + c x , v = f y × ( y d ) + c y u=f_x×(\frac x d)+c_x,v=f_y×(\frac y d)+c_y u=fx×(dx)+cx,v=fy×(dy)+cy
在计算机里面喜欢用矩阵来存储公式。上面那个变换公式可以写成矩阵形式(用的是齐次坐标):
( u v 1 ) = 1 d ( f x 0 c x 0 f y c y 0 0 1 ) ( x y d ) = 1 d K P \begin{pmatrix} u \\ v \\ 1 \end{pmatrix}=\frac 1 {d} \begin{pmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} x \\ y \\ d \end{pmatrix}=\frac 1 {d} KP uv1=d1fx000fy0cxcy1xyd=d1KP
为了好看没分母会这么写:
d ( u v 1 ) = K P d\begin{pmatrix} u \\ v \\ 1 \end{pmatrix}= KP duv1=KP
那个K矩阵里面都是常数,相机出厂后这些参数就不会变了。所以这个矩阵叫做相机内参数矩阵
由于三维重建这个应用中,相机是运动的,而现在我们用的物体的坐标是物体相对相机的坐标。为了统一坐标系,一般会设置一个世界坐标系。那么需要一个变换把物的在世界坐标变换到相机坐标。这个变换包含旋转与平移变换,一般乘上个齐次变换矩阵T就可以了。相机坐标变换模型变成了
d ( u v 1 ) = K ( T P w ) d\begin{pmatrix} u \\ v \\ 1 \end{pmatrix}= K(TP_w) duv1=K(TPw),其中 P w P_w Pw是物体在世界坐标下的坐标。这个变换矩阵T叫做相机的外参数,其实它就是相机移动的轨迹。

图像畸变变形矫正

正常的小孔成像是不会产生畸变的,但是为了增强光线相机都使用了透镜。这就会使得照片发生畸变。由于这种透镜引起的畸变是对称的所以叫做径向畸变。它分为两种一种是桶形畸变后视镜和鹰眼看到那种,还有一种是枕形畸变向内缩。同时相机组装过程由于不能使得透镜与成像面完全平行,也会产生畸变,这个畸变叫做切向畸变

径向畸变矫正原理,因为这是因为透镜所造成。所以越远离中心点需要矫正的越大。所以矫正的量要与像素点离中心点距离r呈正比。那为何要设计三个矫正参数k1,k2,k3。当畸变小的时候那就只让k1起作用,较大那就k3起作用。当然到底取多少那得算出来,一般用棋盘格标定然后算出畸变参数。
在这里插入图片描述
切向畸变矫正(???这个地方我不大懂):
X c o r r e c t e d = x + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) Y c o r r e c t e d = y + 2 p 2 x y + p 1 ( r 2 + 2 y 2 ) X_{corrected}=x+2p_1xy+p_2(r^2+2x^2) \\ Y_{corrected}=y+2p_2xy+p_1(r^2+2y^2) Xcorrected=x+2p1xy+p2(r2+2x2)Ycorrected=y+2p2xy+p1(r2+2y2)

你可能感兴趣的:(三维图形学理论与编程实践,视觉SLAM从入门到实践)