【自动驾驶】16.计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换
本篇博客為轉載,我對其中的細節添加了一些說明。
原文鏈接:https://blog.csdn.net/chentravelling/article/details/53558096
0.前言
最近整理了“相機成像原理”和“視差與深度信息”相關的資料,然后做成了PPT,以備自己用,也提供給相關的圖像、視覺方向的朋友參考。如有誤,望海涵并指出。
1.正文
圖像處理、立體視覺等等方向常常涉及到四個坐標系:世界坐標系、相機坐標系、圖像坐標系、像素坐標系。例如下圖:
zhz注:根據右手定則,下面的相機坐標系和世界坐標系的Y軸方向都反了,因為拇指指向X正方向,食指指向Y軸正方向,那么Z軸的正方向就是中指指向。下面的相機坐標系和世界坐標系都是左手坐標系。
構建世界坐標系只是為了更好的描述相機的位置在哪里,在雙目視覺中一般將世界坐標系原點定在左相機或者右相機或者二者X軸方向的中點。
接下來的重點,就是關于這幾個坐標系的轉換。也就是說,一個現實中的物體是如何在圖像中成像的。
1.1世界坐標系與相機坐標系
于是,從世界坐標系到相機坐標系,涉及到旋轉和平移(其實所有的運動也可以用旋轉矩陣和平移向量來描述)。繞著不同的坐標軸旋轉不同的角度,得到相應的旋轉矩陣,如下圖所示:
那么從世界坐標系到相機坐標系的轉換關系如下所示:
1.2相機坐標系與圖像坐標系
從相機坐標系到圖像坐標系,屬于透視投影關系,從3D轉換到2D。
- p(x,y)是圖像坐標系上的點(即相機坐標系上的點投影到圖像坐標系的投影點),o是圖像坐標系的中點,也是相機的焦點,f是相機的焦距。
- 相機的成像平面 就是 圖像坐標系所在平面(二維平面)。
- P(Xc,Yc,Zc)是相機坐標系上的點,Oc是相機的光心。
此時投影點p(x,y)的單位還是mm,并不是pixel,需要進一步轉換到像素坐標系。
1.3圖像坐標系與像素坐標系
像素坐標系和圖像坐標系都在成像平面上,只是各自的原點和度量單位不一樣。圖像坐標系的原點為相機光軸與成像平面的交點,通常情況下是成像平面的中點或者叫主點(principal point)。
圖像坐標系的單位是mm,屬于物理單位,而像素坐標系的單位是pixel,我們平常描述一個像素點都是幾行幾列。
所以這二者之間的轉換如下:其中dx和dy表示每一列和每一行分別代表多少mm,即1pixel=dx mm。就是說,
dx就是在水平方向上1個像素的長度(單位mm);
dy就是在豎直方向上1個像素的長度(單位mm)。
p(x,y)是圖像坐標系上的點,O(u0,v0)是圖像坐標系的中心點,u0,v0對應像素坐標系的u0個pixel 和 v0個pixel,并非mm,如果像素平面的分辨率為W*H (單位pixel), 那么
u0=1/2?Wv0=1/2?Hu_0=1/2*W \\ v_0=1/2*Hu0?=1/2?Wv0?=1/2?H
注意p(x,y)的x,y是從圖像坐標系中心點開始的偏移,單位是mm,所以:
- x/dx是從p(x,y)到圖像坐標系中心點的橫向偏移;
- y/dy是從p(x,y)到圖像坐標系中心點的縱向偏移;
- u0,v0為像素坐標系的中心點(不是原點,原點在左上角),等于圖片像素的寬和高的一半;
- 圖像坐標系 x,y和像素坐標系u,v的量綱單位不一樣,x,y是mm, u,v是pixel。
一個點從相機坐標系投影到圖像坐標系的點P(x,y),此時單位還是mm,點p(x,y)的坐標值x,y表示的是距離圖像中心點,也是圖像坐標系原點的距離(mm)。
由于圖像坐標系和像素坐標系就是同一個平面,只是原點不一樣。所以點P(x,y)在像素坐標系的坐標就變成了:
u=xdx+u0v=ydy+v0u=\frac{x}{d_x} +u_0 \\ \quad \\ v=\frac{y}{d_y}+v_0u=dx?x?+u0?v=dy?y?+v0?
計算p(x,y)投影到像素坐標系上的值:
那么通過上面四個坐標系的轉換就可以得到世界坐標系中的一個點P(Xw,Yw,Zw)如何投影到像素坐標系中的一個點p(u,v)。
前兩個矩陣相乘,令fx=f/dx,fy=f/dy,得到的就是上圖中標出的相機內參矩陣。其中,fx和fy也叫等效焦距。
相機的內參和外參可以通過張正友標定獲取(戳這里查看張正友標定的資料)。
相機內參矩陣K是一個3x3的上三角矩陣。
剛學的小伙伴們可能會有疑問了:為什么上面要把相機內參寫成3x4矩陣形式,相機外參寫成4x4的形式?
答:是因為在進行代碼編程時,并不會使用(R*P+t)這種求法,而且求相反的變換時,涉及到求變換矩陣的逆,而求逆必須是對方陣求逆。所以這里要多加一行[0?1?3,1][ \vec{0}_{1*3},1][01?3?,1]。
對于內參矩陣有變成3x4,這里可不必糾結,因為當需要求逆時,我們會把旋轉矩陣和平移向量寫成齊次矩陣。我們注意看的話,會發現,上面的相機內參3x4其實只有2x3是有效的,其他的都是填充的,并且,里面的3x3已經是齊次了。他這里把相機內參矩陣擴展成3x4只是為了使等式維度吻合,才寫成了3x4。實際編程中,只需要把相機內參矩陣取3x3的齊次矩陣,然后再與坐標點進行運算即可。
分析一下這幾個空間變換:
如果把物點在相機坐標系下所在的平面叫做物平面。為了描述方便,我們這里以點(XC,YC,ZC)(X_C,Y_C,Z_C)(XC?,YC?,ZC?)來描述物平面。那么從物平面(XC,YC,ZC)(X_C,Y_C,Z_C)(XC?,YC?,ZC?)除以ZcZ_cZc?變成歸一化平面(XC/ZC,YC/ZC,1)(X_C/Z_C,Y_C/Z_C,1)(XC?/ZC?,YC?/ZC?,1)。
相機坐標系 -> 圖像坐標系:
[xy1]=[f000f0001][Xc/ZCYc/Zc1]\begin{bmatrix} x\\y\\1 \end{bmatrix} =\begin{bmatrix} f&0&0\\0&f&0\\0&0&1 \end{bmatrix} \begin{bmatrix} {X_c/Z_C}\\Y_c/Z_c\\1 \end{bmatrix} ???xy1????=???f00?0f0?001???????Xc?/ZC?Yc?/Zc?1????
這里不是fxf_xfx?和fyf_yfy?,因為這里是相機坐標系到圖像坐標系,單位還是mm,并沒有變到像素坐標系中。變到像素坐標系中才需要fff除以dxd_xdx?和dyd_ydy?后變成fxf_xfx?和fyf_yfy?.
歸一化平面(XCZC,YCZC,1)(\frac{X_C}{Z_C},\frac{Y_C}{Z_C},1)(ZC?XC??,ZC?YC??,1)乘以焦距fff變為成像平面(x,y)(x,y)(x,y)。
成像平面(x,y)(x,y)(x,y),把長度m和像素直接進行縮放變化,并平移中心點到左上角,就變成像素平面(u,v)(u,v)(u,v)。
或者直接由歸一化平面(XCZC,YCZC,1)(\frac{X_C}{Z_C},\frac{Y_C}{Z_C},1)(ZC?XC??,ZC?YC??,1)乘以相機內參矩陣K,變為像素平面,一步到位。
圖像坐標系 -> 像素坐標系:
[uv1]=[f/dx0u00f/dyv0001][Xc/ZCYc/Zc1]=[fx0u00fyv0001][Xc/ZCYc/Zc1]\begin{bmatrix} u\\v\\1 \end{bmatrix} =\begin{bmatrix} f/dx&0&u_0\\0&f/dy&v_0\\0&0&1 \end{bmatrix} \begin{bmatrix} {X_c/Z_C}\\Y_c/Z_c\\1 \end{bmatrix} =\begin{bmatrix} f_x&0&u_0\\0&f_y&v_0\\0&0&1 \end{bmatrix} \begin{bmatrix} {X_c/Z_C}\\Y_c/Z_c\\1 \end{bmatrix} ???uv1????=???f/dx00?0f/dy0?u0?v0?1???????Xc?/ZC?Yc?/Zc?1????=???fx?00?0fy?0?u0?v0?1???????Xc?/ZC?Yc?/Zc?1????
Zc值求解:\color{red}Z_c值求解:Zc?值求解:
關于ZcZ_cZc?值求解,可參考這篇博客:像素坐標轉到世界坐標時相機坐標系中的Zc值求解,其中 R為旋轉矩陣,K為相機內參矩陣,T為平移向量,均為已知值。ZcZ_cZc?是世界坐標系的某點P(Xw,Yw,Zw)P(X_w,Y_w,Z_w)P(Xw?,Yw?,Zw?)投影到相機坐標系的點的ZZZ方向坐標,該博客主要內容如下截圖:
對于每個像素(u,v)(u,v)(u,v),都有一個對應的ZcZ_cZc?,所以,并不是對整張圖的像素來說,只有一個ZcZ_cZc?。
當我們需要從2D像素點反投影到3D世界坐標系時,只需要知道像素坐標、相機內參、相機外參(即:相機到世界坐標系的旋轉矩陣、平移矩陣),就可以求得這個像素對應的深度ZcZ_cZc?,進而可以通過前面的公式:
得到該像素對應的三維世界坐標系點。我們在自動駕駛開發項目中,一般會把世界坐標系設定為車身坐標系。對于地面上的車道線等,由于我們知道車身坐標系的原點離地面的高度,就知道了車身坐標系下的ZwZ_wZw?,進而可以得到深度信息ZcZ_cZc?,從而得到圖像中車道線的該像素對應的三維車身坐標系點。
不過,對于高度未知的,就不能求出ZcZ_cZc?了。
所以,通過最終的轉換關系來看,一個三維中的坐標點,的確可以在圖像中找到一個對應的像素點,但是反過來,通過圖像中的一個點找到它在三維中對應的點就很成了一個問題,因為我們并不知道等式左邊的ZcZ_cZc?的值。
關于三維重建不是我的方向,但是深度值的獲取是我項目中的一個需要解決的問題,這將涉及到后面的立體視覺知識。
上面的公式中省略了去畸變的步驟,該步驟是在使用相機內參矩陣進行變換前,在相機外參矩陣*世界坐標系,得到相機坐標系點(Xc,Yc,Zc),將其取前兩維度除以【Zc】得到二維點(Xc/Zc,Yc/Zc),見下面公式:
把公式左右兩邊都除以Zc,然后進行去畸變運算,得到去畸變后的二維點(x,y),再將去畸變的二維點(x,y)經過【相機內參矩陣】計算,得到最終的像素點坐標(u,v),即
【PPT下載】
地址:http://download.csdn.net/detail/chentravelling/9833120
原文評論截圖:
總結
以上是生活随笔為你收集整理的【自动驾驶】16.计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【自动驾驶】15.一文读懂图像中点的坐标
- 下一篇: 【自动驾驶】13. Apollo交通信号