认知机器人:相机校准
本文章收錄在黑鯨智能系統(tǒng)知識(shí)庫(kù)-黑鯨智能系統(tǒng)知識(shí)庫(kù)成立于2021年,致力于建立一個(gè)完整的智能系統(tǒng)知識(shí)庫(kù)體系。我們的工作:收集和整理世界范圍內(nèi)的學(xué)習(xí)資源,系統(tǒng)地建立一個(gè)內(nèi)容全面、結(jié)構(gòu)合理的知識(shí)庫(kù)。
作者博客:途中的樹
在機(jī)器人的感知系統(tǒng)中,有時(shí)我們需要攝像機(jī)來構(gòu)建三維世界的投影圖像,這篇文章來聊一聊
攝像機(jī)模型
- 描述了一個(gè)三維世界點(diǎn)在攝像機(jī)圖像中的投影。
- 假設(shè)
- 有一個(gè)無限小的小孔的盒子
- 攝像機(jī)中心是射線的交匯點(diǎn)(針孔)。
- 后墻是圖像平面image plane
- 攝像機(jī)中心和圖像平面之間的距離是攝像機(jī)常數(shù)Camera constant
在歐幾里德幾何學(xué)中描述這種變換是比較困難的,不過在射影幾何中就簡(jiǎn)單許多,射影幾何的變換可以在齊次坐標(biāo)系下表示
- 射影幾何 Projective geometry是幾何變換的一個(gè)可替代方法
- 齊次坐標(biāo)系homogenous coordinates 在機(jī)器人學(xué)中廣泛應(yīng)用
- 優(yōu)勢(shì):在射影幾何中仿射變換和投影變換可以用一個(gè)矩陣的乘法來傳達(dá)
相機(jī)校準(zhǔn)
- 相機(jī)可以將三維世界的點(diǎn)投射到二維圖像平面上
- 校準(zhǔn)的影響因素
- 圖片中心
- 焦距
- 鏡頭畸變參數(shù)
- 為什么需要校準(zhǔn)
- 便宜的鏡頭,相機(jī)的制作過程中都會(huì)產(chǎn)生誤差
- 精確的校準(zhǔn)是非常必要的
- 圖像3D信息解釋
- 重建地圖模型
- 機(jī)器人與環(huán)境的互動(dòng)(手眼協(xié)調(diào))
Pinhole相機(jī)的三個(gè)假設(shè)
- 當(dāng)然這些假設(shè)往往不成立,導(dǎo)致圖像不完美
鏡頭和針孔的區(qū)別
- 鏡頭只是針孔相機(jī)模型的一個(gè)近似值
- 物體上和圖像中的相應(yīng)點(diǎn),以及鏡頭的中心通常不在一條線上
- 光束通過透鏡中心的距離越遠(yuǎn),誤差就越大
坐標(biāo)系框架
- 環(huán)境坐標(biāo)系 World coordinate frame SoS_oSo?
- 表示為 [X,Y,Z]T[X,Y,Z]^T[X,Y,Z]T
- 相機(jī)坐標(biāo)系 Camera coordinate frame SkS_kSk?
- 表示為 [kX,kY,kZ]T[^kX,^kY,^kZ]^T[kX,kY,kZ]T
- 圖像坐標(biāo)系 image coordinate frame ScS_cSc?
- 表示為 [cx,cy]T[^cx,^cy]^T[cx,cy]T
- 傳感器坐標(biāo)系 Sensor coordinate SsS_sSs?
- 表示為 [sx,sy]T[^sx,^sy]^T[sx,sy]T
坐標(biāo)系轉(zhuǎn)換 Transformation
- 我們想要從傳感器坐標(biāo)系轉(zhuǎn)換到環(huán)境坐標(biāo)系
- 其中環(huán)境坐標(biāo)系SoS_oSo? 到相機(jī)坐標(biāo)系SkS_kSk?屬于外在轉(zhuǎn)換
- 外在參數(shù)描述攝像機(jī)在環(huán)境中的姿態(tài)
- 其他的轉(zhuǎn)換屬于內(nèi)在轉(zhuǎn)換
- 內(nèi)在參數(shù)描述了相機(jī)前的場(chǎng)景與最終圖像(傳感器)中的像素的映射關(guān)系
假設(shè)一個(gè)點(diǎn)P\mathcal{P}P
外在參數(shù)
- 攝像機(jī)相對(duì)于世界的姿態(tài)
- 可逆變換 Invertible transformation
- How many parameters are needed?
- 6個(gè):3個(gè)位置參數(shù)+3個(gè)方向參數(shù)
- 在環(huán)境坐標(biāo)系中點(diǎn)P\mathcal{P}P的坐標(biāo)為 XP=[XP,YP,ZP]T\mathrm{X}_P=[X_P,Y_P,Z_P]^TXP?=[XP?,YP?,ZP?]T
- 在相機(jī)坐標(biāo)系中圓點(diǎn)的坐標(biāo)(在環(huán)境坐標(biāo)系中的坐標(biāo))為 XO=[XO,YO,ZO]T\mathrm{X}_O=[X_O,Y_O,Z_O]^TXO?=[XO?,YO?,ZO?]T
- 在下文中,我們將看到為什么與歐幾里得坐標(biāo)相比,H.C.是描述變換的更好選擇
環(huán)境坐標(biāo)系轉(zhuǎn)換到相機(jī)坐標(biāo)系 So→SkS_o \rightarrow S_kSo?→Sk?
直覺上講,知道了環(huán)境坐標(biāo)系中的坐標(biāo),也知道的相機(jī)坐標(biāo)系的坐標(biāo),想將點(diǎn)坐標(biāo)從環(huán)境坐標(biāo)系轉(zhuǎn)換到相機(jī)坐標(biāo)系,可以先做一個(gè)平移和旋轉(zhuǎn) kXP=R(XP?XO)^kX_P=R(X_P-X_O)kXP?=R(XP??XO?),當(dāng)然這是在歐式坐標(biāo)系中的表示
如果放到H.C.齊次坐標(biāo)系中,則為
- [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?]
內(nèi)在參數(shù)
- 將點(diǎn)從相機(jī)框架投射到傳感器框架的過程
- 可逆變換
- 圖像平面到傳感器框架
- 模型偏差
- 不能直接倒置:投影
- 理想狀態(tài)下的投影可以分為三步
- 將透視投影投射到圖像平面上
- 轉(zhuǎn)換到傳感器坐標(biāo)系框架(像素)
- 前面兩個(gè)映射步驟是理想化的,需要進(jìn)行校正,或者說補(bǔ)償compensation
相機(jī)坐標(biāo)系到圖像坐標(biāo)系
- 在圖像坐標(biāo)系統(tǒng)中:
- 我們定義一個(gè)相機(jī)常數(shù) ccc 用來表示投影中心(小孔位置)OOO到圖像平面中心H\mathcal{H}H的距離
- 該值是作為相機(jī)校準(zhǔn)的一部分計(jì)算出來的
- c<0c<0c<0情況如下圖
如果上圖的透視投影是沒誤差的,根據(jù)截?cái)喽ɡ韼缀侮P(guān)系我們可以得到點(diǎn)P\mathcal{P}P (3D)在圖像平面上的投影點(diǎn)P ̄\overline{\mathcal{P}}P(3D)的坐標(biāo)[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. 齊次坐標(biāo)模式
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????這定義了從相機(jī)框架中的一個(gè)點(diǎn)到圖像框架的投影
環(huán)境坐標(biāo)系到圖像坐標(biāo)系
-
如此結(jié)合一下前面的兩部轉(zhuǎn)換,從世界框架到相機(jī)框架的轉(zhuǎn)換,然后投射到圖像框架中(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?]
-
理想相機(jī)的校準(zhǔn)矩陣 cK=[c000c0001]^c\mathrm{K}=\begin{bmatrix} c & 0 & 0\\0 & c & 0\\0 & 0 & 1\\\end{bmatrix}cK=???c00?0c0?001????
-
我們可以把整個(gè)映射寫成右圖
-
各種矩陣變換,就不細(xì)說了下面寫一下最后結(jié)果
- 校準(zhǔn)矩陣
- 現(xiàn)在我們有cP=cKR[I3∣?XO]^c\mathrm{P}=^c\mathrm{K}R[I_3|-X_O]cP=cKR[I3?∣?XO?]
- 所以現(xiàn)在把一個(gè)點(diǎn)映射到圖像層為 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.坐標(biāo)為 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?????
環(huán)境坐標(biāo)到傳感器坐標(biāo)
-
現(xiàn)在要把圖像層映射到傳感器層
-
假設(shè)圖像層到傳感器層是線性誤差
-
主點(diǎn)在圖像平面中的位置(偏移)
-
基于芯片設(shè)計(jì)的x和y的比例差異
-
圖像層的中心點(diǎn)的位置
- 傳感器坐標(biāo)系的中心點(diǎn)(0,0)(0,0)(0,0)并不是圖像的中心點(diǎn)
- 通過移位來補(bǔ)償偏移
- 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????
- 最后得到傳感器坐標(biāo)
- 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????
相機(jī)參數(shù)
- 這個(gè)就是我們要找的相機(jī)參數(shù),拋開旋轉(zhuǎn)不論
- 這個(gè)校準(zhǔn)矩陣Calibration Matrix包含4個(gè)參數(shù)
- 相機(jī)常數(shù)ccc
- 中心點(diǎn) xH,yHx_H,y_HxH?,yH?
- 比例差異 mmm
- 這個(gè)校準(zhǔn)矩陣Calibration Matrix包含4個(gè)參數(shù)
非線性誤差補(bǔ)償
- 到目前為止,我們只考慮了線性參數(shù)
- 現(xiàn)實(shí)世界是非線性的
- 不完善的鏡頭
- 傳感器的非平面性
- …
- 怎么解決呢?
- 再加最后一步校正這個(gè)非線性的影響
- 傳感器坐標(biāo)系中與位置有關(guān)的移動(dòng)
- 根據(jù)與圖像中心的距離,對(duì)每個(gè)像素進(jìn)行單獨(dú)移動(dòng)
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
- 來個(gè)例子吧
- 畸變的近似值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 是一般映射的附加參數(shù)
- 放到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
最終校正矩陣
-
一般的校準(zhǔn)矩陣是通過將仿生變換的矩陣與一般的映射結(jié)合起來得到的
- 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是未知的,我們稱之為未校準(zhǔn)的攝像機(jī)
-
如果Intrinsics是已知的,我們稱相機(jī)為校準(zhǔn)的。
-
獲得Intrinsics的過程被稱為相機(jī)校準(zhǔn)
總結(jié)
以上是生活随笔為你收集整理的认知机器人:相机校准的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 采用ImageJ+插件批量转换透射电镜s
- 下一篇: 认知科学期末复习笔记