认知机器人:相机校准
本文章收錄在黑鯨智能系統知識庫-黑鯨智能系統知識庫成立于2021年,致力于建立一個完整的智能系統知識庫體系。我們的工作:收集和整理世界范圍內的學習資源,系統地建立一個內容全面、結構合理的知識庫。
作者博客:途中的樹
在機器人的感知系統中,有時我們需要攝像機來構建三維世界的投影圖像,這篇文章來聊一聊
攝像機模型
- 描述了一個三維世界點在攝像機圖像中的投影。
- 假設
- 有一個無限小的小孔的盒子
- 攝像機中心是射線的交匯點(針孔)。
- 后墻是圖像平面image plane
- 攝像機中心和圖像平面之間的距離是攝像機常數Camera constant
在歐幾里德幾何學中描述這種變換是比較困難的,不過在射影幾何中就簡單許多,射影幾何的變換可以在齊次坐標系下表示
- 射影幾何 Projective geometry是幾何變換的一個可替代方法
- 齊次坐標系homogenous coordinates 在機器人學中廣泛應用
- 優勢:在射影幾何中仿射變換和投影變換可以用一個矩陣的乘法來傳達
相機校準
- 相機可以將三維世界的點投射到二維圖像平面上
- 校準的影響因素
- 圖片中心
- 焦距
- 鏡頭畸變參數
- 為什么需要校準
- 便宜的鏡頭,相機的制作過程中都會產生誤差
- 精確的校準是非常必要的
- 圖像3D信息解釋
- 重建地圖模型
- 機器人與環境的互動(手眼協調)
Pinhole相機的三個假設
- 當然這些假設往往不成立,導致圖像不完美
鏡頭和針孔的區別
- 鏡頭只是針孔相機模型的一個近似值
- 物體上和圖像中的相應點,以及鏡頭的中心通常不在一條線上
- 光束通過透鏡中心的距離越遠,誤差就越大
坐標系框架
- 環境坐標系 World coordinate frame SoS_oSo?
- 表示為 [X,Y,Z]T[X,Y,Z]^T[X,Y,Z]T
- 相機坐標系 Camera coordinate frame SkS_kSk?
- 表示為 [kX,kY,kZ]T[^kX,^kY,^kZ]^T[kX,kY,kZ]T
- 圖像坐標系 image coordinate frame ScS_cSc?
- 表示為 [cx,cy]T[^cx,^cy]^T[cx,cy]T
- 傳感器坐標系 Sensor coordinate SsS_sSs?
- 表示為 [sx,sy]T[^sx,^sy]^T[sx,sy]T
坐標系轉換 Transformation
- 我們想要從傳感器坐標系轉換到環境坐標系
- 其中環境坐標系SoS_oSo? 到相機坐標系SkS_kSk?屬于外在轉換
- 外在參數描述攝像機在環境中的姿態
- 其他的轉換屬于內在轉換
- 內在參數描述了相機前的場景與最終圖像(傳感器)中的像素的映射關系
假設一個點P\mathcal{P}P
外在參數
- 攝像機相對于世界的姿態
- 可逆變換 Invertible transformation
- How many parameters are needed?
- 6個:3個位置參數+3個方向參數
- 在環境坐標系中點P\mathcal{P}P的坐標為 XP=[XP,YP,ZP]T\mathrm{X}_P=[X_P,Y_P,Z_P]^TXP?=[XP?,YP?,ZP?]T
- 在相機坐標系中圓點的坐標(在環境坐標系中的坐標)為 XO=[XO,YO,ZO]T\mathrm{X}_O=[X_O,Y_O,Z_O]^TXO?=[XO?,YO?,ZO?]T
- 在下文中,我們將看到為什么與歐幾里得坐標相比,H.C.是描述變換的更好選擇
環境坐標系轉換到相機坐標系 So→SkS_o \rightarrow S_kSo?→Sk?
直覺上講,知道了環境坐標系中的坐標,也知道的相機坐標系的坐標,想將點坐標從環境坐標系轉換到相機坐標系,可以先做一個平移和旋轉 kXP=R(XP?XO)^kX_P=R(X_P-X_O)kXP?=R(XP??XO?),當然這是在歐式坐標系中的表示
如果放到H.C.齊次坐標系中,則為
- [kXp1]=[R00T1][I3?XO0T1][XP1]=[R?RXO0T1][XP1]\begin{bmatrix} ^kX_p \\ 1 \end{bmatrix} = \begin{bmatrix} R & 0 \\ 0^\mathrm{T} & 1 \end{bmatrix}\begin{bmatrix} I_3 & -X_O \\ 0^\mathrm{T} & 1 \end{bmatrix}\begin{bmatrix} X_{P} \\ 1 \end{bmatrix}= \begin{bmatrix} R & -RX_O \\ 0^\mathrm{T} & 1 \end{bmatrix}\begin{bmatrix} X_P \\ 1 \end{bmatrix}[kXp?1?]=[R0T?01?][I3?0T??XO?1?][XP?1?]=[R0T??RXO?1?][XP?1?]
- 或者寫為kXP=kHXP^k\mathrm{X}_P=^k\mathrm{HX}_PkXP?=kHXP?有kH=[R?RXO0T1]^k\mathrm{H}= \begin{bmatrix} R & -RX_O \\ 0^\mathrm{T} & 1 \end{bmatrix}kH=[R0T??RXO?1?]
內在參數
- 將點從相機框架投射到傳感器框架的過程
- 可逆變換
- 圖像平面到傳感器框架
- 模型偏差
- 不能直接倒置:投影
- 理想狀態下的投影可以分為三步
- 將透視投影投射到圖像平面上
- 轉換到傳感器坐標系框架(像素)
- 前面兩個映射步驟是理想化的,需要進行校正,或者說補償compensation
相機坐標系到圖像坐標系
- 在圖像坐標系統中:
- 我們定義一個相機常數 ccc 用來表示投影中心(小孔位置)OOO到圖像平面中心H\mathcal{H}H的距離
- 該值是作為相機校準的一部分計算出來的
- c<0c<0c<0情況如下圖
如果上圖的透視投影是沒誤差的,根據截斷定理幾何關系我們可以得到點P\mathcal{P}P (3D)在圖像平面上的投影點P ̄\overline{\mathcal{P}}P(3D)的坐標[cxP ̄,cyP ̄][^cx_{\overline{\mathcal{P}}},^cy_{\overline{\mathcal{P}}}][cxP?,cyP?],
cxP ̄:=kXP ̄=ckXPkZP^cx_{\overline{\mathcal{P}}}:=^kX_{\overline{\mathcal{P}}}=c\frac{^kX_{\mathcal{P}}}{^kZ_{\mathcal{P}}}cxP?:=kXP?=ckZP?kXP??
cyP ̄:=kYP ̄=ckXPkZP^cy_{\overline{\mathcal{P}}}:=^kY_{\overline{\mathcal{P}}}=c\frac{^kX_{\mathcal{P}}}{^kZ_{\mathcal{P}}}cyP?:=kYP?=ckZP?kXP??
H.C. 齊次坐標模式
cxP ̄=[cuP ̄cvP ̄cwP ̄]=[c0000c000010][cXPcYPcZP1]^c\mathrm{x}_{\overline{\mathcal{P}}}= \begin{bmatrix} ^cu_{\overline{P}}\\^cv_{\overline{P}}\\^cw_{\overline{P}} \end{bmatrix} = \begin{bmatrix} c & 0 & 0 & 0\\0 & c & 0 & 0\\0 & 0 & 1 & 0 \end{bmatrix}\begin{bmatrix} ^cX_P\\^cY_P\\^cZ_P\\1 \end{bmatrix}cxP?=???cuP?cvP?cwP?????=???c00?0c0?001?000?????????cXP?cYP?cZP?1??????
可以寫成 cxP ̄=cPkkXP^c\mathrm{x}_{\overline{\mathcal{P}}}= ^c\mathrm{P}_k \\ ^k\mathrm{X}_PcxP?=cPk?kXP? with cPk=[c0000c000010]^c\mathrm{P}_k =\begin{bmatrix} c & 0 & 0 & 0\\0 & c & 0 & 0\\0 & 0 & 1 & 0 \end{bmatrix}cPk?=???c00?0c0?001?000????這定義了從相機框架中的一個點到圖像框架的投影
環境坐標系到圖像坐標系
-
如此結合一下前面的兩部轉換,從世界框架到相機框架的轉換,然后投射到圖像框架中(H.C.)
cxP ̄=cPX^c\mathrm{x}_{\overline{\mathcal{P}}}= ^c\mathrm{P}\mathrm{X}cxP?=cPX with cP=cPkkH=[c0000c000010][R?RXO0T1]^c\mathrm{P}=^c\mathrm{P}_k {^k\mathrm{H}}=\begin{bmatrix} c & 0 & 0 & 0\\0 & c & 0 & 0\\0 & 0 & 1 & 0 \end{bmatrix}\begin{bmatrix} R & -RX_O \\ 0^\mathrm{T} & 1 \end{bmatrix}cP=cPk?kH=???c00?0c0?001?000????[R0T??RXO?1?]
-
理想相機的校準矩陣 cK=[c000c0001]^c\mathrm{K}=\begin{bmatrix} c & 0 & 0\\0 & c & 0\\0 & 0 & 1\\\end{bmatrix}cK=???c00?0c0?001????
-
我們可以把整個映射寫成右圖
-
各種矩陣變換,就不細說了下面寫一下最后結果
- 校準矩陣
- 現在我們有cP=cKR[I3∣?XO]^c\mathrm{P}=^c\mathrm{K}R[I_3|-X_O]cP=cKR[I3?∣?XO?]
- 所以現在把一個點映射到圖像層為 cx=cKR[I3∣?XO]X^c\mathrm{x}=^c\mathrm{K}R[I_3|-X_O]\mathrm{X}cx=cKR[I3?∣?XO?]X
- 最后得到H.C.坐標為 cx^c\mathrm{x}cx
- [cu′cv′cw′]=[c000c0001][r11r12r13r21r22r23r31r32r33][X?XOY?YOZ?ZO]\begin{bmatrix} ^cu'\\^cv'\\^cw' \end{bmatrix} = \begin{bmatrix} c & 0 & 0 \\0 & c & 0 \\0 & 0 & 1 \end{bmatrix}\begin{bmatrix} r_11 & r_12 & r_13 \\r_21 & r_22 & r_23 \\r_31 & r_32 & r_33 \end{bmatrix}\begin{bmatrix} X-X_O\\Y-Y_O\\Z-Z_O \end{bmatrix}???cu′cv′cw′????=???c00?0c0?001???????r1?1r2?1r3?1?r1?2r2?2r3?2?r1?3r2?3r3?3???????X?XO?Y?YO?Z?ZO?????
環境坐標到傳感器坐標
-
現在要把圖像層映射到傳感器層
-
假設圖像層到傳感器層是線性誤差
-
主點在圖像平面中的位置(偏移)
-
基于芯片設計的x和y的比例差異
-
圖像層的中心點的位置
- 傳感器坐標系的中心點(0,0)(0,0)(0,0)并不是圖像的中心點
- 通過移位來補償偏移
- cHc=[10xH01yH001]^c\mathrm{H}_c=\begin{bmatrix} 1 & 0 & x_{\mathrm{H}}\\0 & 1 & y_{\mathrm{H}}\\0 & 0 & 1\\\end{bmatrix}cHc?=???100?010?xH?yH?1????
- 比例差別
- cHc=[10xH01+myH001]^c\mathrm{H}_c=\begin{bmatrix} 1 & 0 & x_{\mathrm{H}}\\0 & 1+m & y_{\mathrm{H}}\\0 & 0 & 1\\\end{bmatrix}cHc?=???100?01+m0?xH?yH?1????
- 最后得到傳感器坐標
- sx=sHccKR[I3∣?XO]X^s\mathrm{x}=^s\mathrm{H}_c\\^c\mathrm{K}R[I_3|-X_O]\mathrm{X}sx=sHc?cKR[I3?∣?XO?]X
- K=sHccK=[10xH01+myH001][c000c0001]=[10xH0c(1+m)yH001]\mathrm{K}=^s\mathrm{H}_c\\^c\mathrm{K}=\begin{bmatrix} 1 & 0 & x_{\mathrm{H}}\\0 & 1+m & y_{\mathrm{H}}\\0 & 0 & 1\\\end{bmatrix}\begin{bmatrix} c & 0 & 0 \\0 & c & 0 \\0 & 0 & 1 \end{bmatrix}=\begin{bmatrix} 1 & 0 & x_{\mathrm{H}}\\0 & c(1+m) & y_{\mathrm{H}}\\0 & 0 & 1\\\end{bmatrix}K=sHc?cK=???100?01+m0?xH?yH?1???????c00?0c0?001????=???100?0c(1+m)0?xH?yH?1????
相機參數
- 這個就是我們要找的相機參數,拋開旋轉不論
- 這個校準矩陣Calibration Matrix包含4個參數
- 相機常數ccc
- 中心點 xH,yHx_H,y_HxH?,yH?
- 比例差異 mmm
- 這個校準矩陣Calibration Matrix包含4個參數
非線性誤差補償
- 到目前為止,我們只考慮了線性參數
- 現實世界是非線性的
- 不完善的鏡頭
- 傳感器的非平面性
- …
- 怎么解決呢?
- 再加最后一步校正這個非線性的影響
- 傳感器坐標系中與位置有關的移動
- 根據與圖像中心的距離,對每個像素進行單獨移動
ax=sx+Δx(x,q)^ax=^sx+\Delta x(x,q)ax=sx+Δx(x,q)
ay=sy+Δy(x,q)^ay=^sy+\Delta y(x,q)ay=sy+Δy(x,q)
In the image
- 來個例子吧
- 畸變的近似值ax=x(1+qr2),ay=y(1+qr2)^ax=x(1+qr^2),^ay=y(1+qr^2)ax=x(1+qr2),ay=y(1+qr2)
- rrr 是像素到圖像中心的距離
- qqq 是一般映射的附加參數
- 放到H.C.
- ax=aHs(x,q)sx^a\mathrm{x}= ^a\mathrm{H}_s(x,q) \\ ^s\mathrm{x}ax=aHs?(x,q)sx with aHs(x,q)=[10Δx(x,q)01Δy(x,q)001]^a\mathrm{H}_s(x,q)=\begin{bmatrix} 1 & 0 & \Delta x(x,q)\\0 & 1 & \Delta y(x,q)\\0 & 0 & 1\\\end{bmatrix}aHs?(x,q)=???100?010?Δx(x,q)Δy(x,q)1????
- ax=aHc(x,q)KR[I3∣?XO]X^a\mathrm{x}=^a\mathrm{H}_c(x,q)\mathrm{K}R[I_3|-X_O]\mathrm{X}ax=aHc?(x,q)KR[I3?∣?XO?]X
最終校正矩陣
-
一般的校準矩陣是通過將仿生變換的矩陣與一般的映射結合起來得到的
- aK(x,q)=aHs(x,q)K=[10xH+Δx(x,q)0c(1+m)yH+Δy(x,q)001]^a\mathrm{K}(x,q)=^a\mathrm{H}_s(x,q)\mathrm{K}=\begin{bmatrix} 1 & 0 & x_{\mathrm{H}}+\Delta x(x,q)\\0 & c(1+m) & y_{\mathrm{H}}+\Delta y(x,q)\\0 & 0 & 1\\\end{bmatrix}aK(x,q)=aHs?(x,q)K=???100?0c(1+m)0?xH?+Δx(x,q)yH?+Δy(x,q)1????
-
這就求得最終的映射
- ax=aP(x,q)X^a\mathrm{x}=^a\mathrm{P}(x,q)\mathrm{X}ax=aP(x,q)X with aP(x,y)=aK(x,y)R[I3∣?XO]^a\mathrm{P}(x,y)= ^a\mathrm{K}(x,y)R[I_3|-X_O]aP(x,y)=aK(x,y)R[I3?∣?XO?]
-
如果Intrinsics是未知的,我們稱之為未校準的攝像機
-
如果Intrinsics是已知的,我們稱相機為校準的。
-
獲得Intrinsics的過程被稱為相機校準
總結
以上是生活随笔為你收集整理的认知机器人:相机校准的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 采用ImageJ+插件批量转换透射电镜s
- 下一篇: 认知科学期末复习笔记