Auther:SeaHIRobot
date: 2023-05-03
最近在做一門(mén)課程的項(xiàng)目,在pybullet中復(fù)現(xiàn)GGCNN的機(jī)械臂視覺(jué)抓取的深度學(xué)習(xí)網(wǎng)絡(luò)。在搭建仿真環(huán)境時(shí),又回到了繞不開(kāi)的相機(jī)內(nèi)參和外參。借此機(jī)會(huì)對(duì)相機(jī)內(nèi)參外參這一套進(jìn)行一個(gè)review,對(duì)這個(gè)問(wèn)題進(jìn)行一個(gè)邏輯梳理。
因此本文不建議純小白閱讀,很多基礎(chǔ)概念不會(huì)細(xì)講,適合對(duì)相機(jī)內(nèi)參外參有一定了解但不完全熟練的同學(xué)。
下面的鏈接是來(lái)自pybullet官方Doc中對(duì)相機(jī)內(nèi)參的推薦閱讀,講的非常生動(dòng)。
Dissecting the Camera Matrix, Part 3: The Intrinsic Matrix ←
這里的知乎文章也推薦閱讀,內(nèi)容詳細(xì):
zhuanlan.zhihu.com
Problem Defination - 問(wèn)題定義
我們?yōu)槭裁匆芯績(jī)?nèi)參外參呢?這些東西有什么意義呢?
思考一下你目前想干的事情,你有一個(gè)相機(jī),你想通過(guò)相機(jī)來(lái)提取場(chǎng)景信息,而通過(guò)相機(jī)你能獲得到的僅僅是由rgb像素構(gòu)成的2d畫(huà)面。從3d的世界中,映射出一個(gè)2d的畫(huà)面,這是相機(jī)的功能。你想做的,是通過(guò)相機(jī)輸出的2d畫(huà)面,獲取3d信息,那么這中間就存在著2d的像素空間和3d的真實(shí)空間的一個(gè)變換。
我們要做的恰恰是尋找這種變換的一種數(shù)學(xué)表達(dá),借助相機(jī)2d的由像素構(gòu)成的畫(huà)面,完成我們提取場(chǎng)景信息的任務(wù)。
”圖片里2d的像素點(diǎn)位 → \rightarrow → 3d的世界坐標(biāo)系中的點(diǎn)位“
這個(gè)任務(wù)既有3d的坐標(biāo)變換,又有像素的2d點(diǎn)位向?qū)嶋H的空間坐標(biāo)之間的尺度變換,怎么進(jìn)一步拆分好讓我們理解呢?那就是一步一步來(lái)咯。
”2d像素點(diǎn)位 → \rightarrow → 3d相機(jī)坐標(biāo)系點(diǎn)位 → \rightarrow → 3d世界坐標(biāo)系點(diǎn)位“
到這里不熟悉相機(jī)坐標(biāo)系和齊次變換的同學(xué)請(qǐng)自行上網(wǎng)百科學(xué)習(xí)。
Pinhole Camera - 針孔相機(jī)
為什么講針孔相機(jī)?這個(gè)模型有什么用?
因?yàn)樗且粋€(gè)很好理解這個(gè)問(wèn)題的簡(jiǎn)單的模型,你可以簡(jiǎn)單得認(rèn)為所有相機(jī)都是這么成像的;
(圖源http://ksimek.github.io/2013/08/13/intrinsic)
圖中的box就是相機(jī),小孔就是鏡頭。光路從環(huán)境中射入,通過(guò)小孔,最終在film上呈現(xiàn)倒像。倒像看起來(lái)比較煩,不如我們把按照相似三角形(或著說(shuō)沿著Pinhole對(duì)稱一下)到樹(shù)的一邊,就成了正像,如下圖。(不用糾結(jié)這樣做有什么意義,問(wèn)就是方便看/doge,下面聊內(nèi)參的時(shí)候你將會(huì)看到有了操作有多奇妙)
(圖源https://zhuanlan.zhihu.com/p/389653208)
使用簡(jiǎn)單的相似三角形,貌似就可以解決針孔相機(jī)的問(wèn)題。但如果事情再?gòu)?fù)雜一點(diǎn)呢?
比如:
- 被拍攝平面(圖里的樹(shù))和film不是平行的
- film中心并不在Pinhole軸線上,有垂直軸線平面的偏移
- 實(shí)際的鏡頭有畸變,不符合針孔攝像頭的簡(jiǎn)單的相似三角形變換
- blablabla…
下面就有請(qǐng)內(nèi)參矩陣(intrinsic matrix)登場(chǎng),進(jìn)一步刻畫(huà)這個(gè)問(wèn)題。
Intrinsic Matrix - 內(nèi)參矩陣
首先,內(nèi)參矩陣長(zhǎng)這個(gè)熊樣子:
I
n
t
r
i
n
s
i
c
?
M
a
t
r
i
x
=
(
f
x
s
x
0
0
f
y
y
0
0
0
1
)
Intrinsic \ Matrix=\left(\begin{array}{c} f_x & s & x_0 \\ 0 & f_y & y_0 \\ 0 & 0 & 1 \end{array}\right)
Intrinsic?Matrix=
?fx?00?sfy?0?x0?y0?1?
?
先不糾結(jié)里面的參數(shù),他干了一件什么事呢?見(jiàn)公式
(
u
v
1
)
=
1
z
c
(
f
x
s
x
0
0
f
y
y
0
0
0
1
)
(
x
c
y
c
z
c
)
\left(\begin{array}{c} u \\ v \\ 1 \end{array}\right) = \frac{1}{z_c}\left(\begin{array}{c} f_x & s & x_0 \\ 0 & f_y & y_0 \\ 0 & 0 & 1 \end{array}\right) \left(\begin{array}{c} x_c \\ y_c \\ z_c \end{array}\right)
?uv1?
?=zc?1?
?fx?00?sfy?0?x0?y0?1?
?
?xc?yc?zc??
?
它連接了像素平面的2d點(diǎn)相機(jī)系;
u和v指定了像素平面內(nèi)的點(diǎn)位,腳標(biāo)c代表了相機(jī)坐標(biāo)系。 z c z_c zc?是相機(jī)坐標(biāo)系的z方向坐標(biāo),換一個(gè)說(shuō)法,就是“深度”。前面的 1 z c \frac{1}{z_c} zc?1?也就是做z方向歸一化,也可以把它寫(xiě)進(jìn)后面的 ( x c , y c , z c ) T (x_c,y_c,z_c)^T (xc?,yc?,zc?)T里,那么相機(jī)坐標(biāo)系里的坐標(biāo)就變成了在z方向歸一化之后的坐標(biāo)了。下面的圖很好的闡釋了這個(gè)過(guò)程,同時(shí)也解釋了把真實(shí)像對(duì)稱過(guò)來(lái)的妙處(因?yàn)榭雌饋?lái)真的舒服)。
(自己畫(huà)的,湊合看吧)
把上面的式子求個(gè)逆,就從像素坐標(biāo)得到了在相機(jī)系中的坐標(biāo):
(
x
c
y
c
z
c
)
=
z
c
(
f
x
s
x
0
0
f
y
y
0
0
0
1
)
?
1
(
u
v
1
)
\left(\begin{array}{c}x_c \\ y_c \\ z_c \end{array}\right) = {z_c}\left(\begin{array}{c} f_x & s & x_0 \\ 0 & f_y & y_0 \\ 0 & 0 & 1 \end{array}\right)^{-1} \left(\begin{array}{c} u \\ v \\ 1 \end{array}\right)
?xc?yc?zc??
?=zc?
?fx?00?sfy?0?x0?y0?1?
??1
?uv1?
?
那 Intrinsic Matrix 里面的參數(shù)是干嘛的呢???為什么x和y方向都有一個(gè)焦距???s究竟是什么??? x 0 x_0 x0? y 0 y_0 y0?到底用什么convention???
這里我簡(jiǎn)短回答一下:
- 有兩個(gè)焦距的原因是實(shí)際傳感器和理想模型的偏差,工藝、像素的幾何形狀等原因
- s s s描述了axis skew,傳感器繞主軸的旋轉(zhuǎn)程度,理想情況如仿真環(huán)境中,那 s s s就是0了(總不可能在相機(jī)組裝的時(shí)候懟的準(zhǔn)準(zhǔn)的吧,不是吧不是吧)
- x o x_o xo? y 0 y_0 y0?描述了主軸偏移。因?yàn)閦軸都?xì)w一化了,歸一化的便利是可以用scaling的方式描述像素尺寸,那 x 0 x_0 x0? y 0 y_0 y0?的單位順理成章的也是像素了。因?yàn)槲覀兠枋鰣D片的像素坐標(biāo)時(shí)候,一般都是左上角為原點(diǎn),x軸向右,y軸向下,在理想情況如仿真環(huán)境中,那 x 0 x_0 x0?就是1/2的傳感器寬度(像素值), y 0 y_0 y0?就是1/2的傳感器高度(像素值);當(dāng)圖片是640x480的時(shí)候, x 0 x_0 x0?就是320, y 0 y_0 y0?就是240。
詳細(xì)的話還是參考http://ksimek.github.io/2013/08/13/intrinsic文章里的解釋,作者還配上了交互式窗口,可以直觀的感受內(nèi)參矩陣的參數(shù)帶來(lái)的影響(真的不是我懶,不是…)
Extrinsic Matrix - 外參矩陣
上面我們借助內(nèi)參矩陣完成了像素點(diǎn) ( u , v ) (u,v) (u,v)到對(duì)應(yīng)的相機(jī)坐標(biāo)系下的點(diǎn) ( x c , y c , z c ) (x_c,y_c,z_c) (xc?,yc?,zc?),那么想要最重要獲得 ( u , v ) (u,v) (u,v)對(duì)應(yīng)的世界坐標(biāo)系中的點(diǎn),那還不好辦,只需要知道變換矩陣 Transfer Matrix 就可以了。所以外參矩陣就是單純的相機(jī)系到約定的世界坐標(biāo)系的 4by4 的 齊次變換矩陣。
齊次變換掌握不牢固的自行補(bǔ)一補(bǔ)。
到這里,我們最后用公式梳理一下怎么從二維像素點(diǎn)位鼓搗到三維世界坐標(biāo)點(diǎn)位的:
第一步:
(
x
c
y
c
z
c
)
=
z
c
(
f
x
s
x
0
0
f
y
y
0
0
0
1
)
?
1
(
u
v
1
)
第二步:
(
x
w
y
w
z
w
)
=
H
c
w
(
x
c
y
c
z
c
)
M
i
s
s
i
o
n
?
c
o
m
p
l
e
t
e
d
.
第一步:\left(\begin{array}{c}x_c \\ y_c \\ z_c \end{array}\right) = {z_c}\left(\begin{array}{c} f_x & s & x_0 \\ 0 & f_y & y_0 \\ 0 & 0 & 1 \end{array}\right)^{-1} \left(\begin{array}{c} u \\ v \\ 1 \end{array}\right) \\ \\ 第二步:\left(\begin{array}{c} x_w \\ y_w \\ z_w \end{array}\right) = H_{c}^{w}\left(\begin{array}{c} x_c \\ y_c \\ z_c \end{array}\right) \\ \\ Mission \ completed.
第一步:
?xc?yc?zc??
?=zc?
?fx?00?sfy?0?x0?y0?1?
??1
?uv1?
?第二步:
?xw?yw?zw??
?=Hcw?
?xc?yc?zc??
?Mission?completed.
相機(jī)標(biāo)定
在仿真環(huán)境中,是不用標(biāo)定的,按照理想情況構(gòu)造就行了。
使用真實(shí)攝像頭就涉及到標(biāo)定的環(huán)節(jié),通過(guò)標(biāo)定我們其實(shí)就是為了擬合出像模像樣的Intrinsic Matrix和Extrinsic Matrix,好讓我們完成這個(gè)從二維像素平面提取世界中的三維信息的任務(wù)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-762634.html
完結(jié)
覺(jué)得有用點(diǎn)個(gè)贊文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-762634.html
到了這里,關(guān)于一文理清相機(jī)內(nèi)參和外參矩陣的來(lái)龍去脈 -- review向的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!