大氣的企業(yè)網(wǎng)站模板視頻推廣
一、四大坐標(biāo)系介紹
1,世界坐標(biāo)系
從這個(gè)世界(world)的視角來看物體
世界坐標(biāo)系是3D空間坐標(biāo),每個(gè)點(diǎn)的位置用 ( X w , Y w , Z w ) (X_w,Y_w,Z_w) (Xw?,Yw?,Zw?)表示
2,相機(jī)坐標(biāo)系
相機(jī)本身具有一個(gè)坐標(biāo)系,其也是3D空間坐標(biāo)
從相機(jī)(camera)的視角來看物體,每個(gè)點(diǎn)的位置用 ( X c , Y c , Z c ) (X_c,Y_c,Z_c) (Xc?,Yc?,Zc?)表示
3,圖像坐標(biāo)系
相機(jī)坐標(biāo)系是3D空間的,而我們通過相機(jī)拍照得到的照片卻是2D平面,這之間涉及到了透視投影(perspective projection),大白話就是相似三角形,將3D空間上的點(diǎn)映射到2D平面上
圖像坐標(biāo)系是實(shí)際的物理坐標(biāo)系 ( x , y ) (x,y) (x,y),其原點(diǎn)位置一般在相機(jī)光軸成像與成像平面的交點(diǎn)位置,通常為成像平面的中心點(diǎn),物理單位為mm
4,像素坐標(biāo)系
我們?cè)谔幚韴D像數(shù)據(jù)的時(shí)候,使用的是像素坐標(biāo)系 ( u , v ) (u,v) (u,v),比如這個(gè)圖像的大小為1080*720,即長(zhǎng)和寬為1080和780個(gè)像素;分辨率等相關(guān)概念也是這個(gè)大概意思,單位是像素pixel
每個(gè)像素都有對(duì)應(yīng)的實(shí)際物理尺寸,比如1像素=0.5mm
像素有些情況是矩形,分為x和y方向的長(zhǎng)度
5,總結(jié)
我們需要通過一些手段,將原本在世界坐標(biāo)系下的點(diǎn)轉(zhuǎn)換到像素坐標(biāo)系下
世界坐標(biāo)系是因?yàn)槲矬w本身真實(shí)存在的位置,而轉(zhuǎn)到像素坐標(biāo)系下是因?yàn)槲覀冊(cè)谶M(jìn)行圖像處理的時(shí)候針對(duì)的是像素
故,相機(jī)標(biāo)定的最終目的是實(shí)現(xiàn)世界坐標(biāo)系和像素坐標(biāo)系之間的轉(zhuǎn)換
二、四大坐標(biāo)系轉(zhuǎn)換
1,世界坐標(biāo)系——相機(jī)坐標(biāo)系
相機(jī)坐標(biāo)系和世界坐標(biāo)系都是3D空間坐標(biāo)系,任何一個(gè)空間中的點(diǎn),都可以通過旋轉(zhuǎn)
和平移
進(jìn)行相互轉(zhuǎn)換
假設(shè)世界坐標(biāo)系下有個(gè)點(diǎn) P w ( X w , Y w , Z w ) P_w(X_w,Y_w,Z_w) Pw?(Xw?,Yw?,Zw?),通過乘以一個(gè)變換矩陣(旋轉(zhuǎn)R+平移T)就可以得到相機(jī)坐標(biāo)系下的對(duì)應(yīng)位置 P c ( X c , Y c , Z c ) P_c(X_c,Y_c,Z_c) Pc?(Xc?,Yc?,Zc?)
[ X c Y c Z c ] = [ R 11 R 12 R 13 R 21 R 22 R 23 R 31 R 32 R 33 ] [ X w Y w Z w ] + [ T 1 T 2 T 3 ] \begin{bmatrix} X_c\\ Y_c\\ Z_c \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_w\\ Y_w\\ Z_w \end{bmatrix}+ \begin{bmatrix} T_1\\ T_2\\ T_3 \end{bmatrix} ?Xc?Yc?Zc?? ?= ?R11?R21?R31??R12?R22?R32??R13?R23?R33?? ? ?Xw?Yw?Zw?? ?+ ?T1?T2?T3?? ?
為了后續(xù)的計(jì)算方便,轉(zhuǎn)換為齊次坐標(biāo)系進(jìn)行表示
[ X c Y c Z c 1 ] = [ R 11 R 12 R 13 T 1 R 21 R 22 R 23 T 2 R 31 R 32 R 33 T 3 0 0 0 1 ] [ X w Y w Z w 1 ] \begin{bmatrix} X_c\\ Y_c\\ Z_c\\ 1 \end{bmatrix}= \begin{bmatrix} R_{11}&R_{12}&R_{13}&T_1\\ R_{21}&R_{22}&R_{23}&T_2\\ R_{31}&R_{32}&R_{33}&T_3\\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} X_w\\ Y_w\\ Z_w\\ 1 \end{bmatrix} ?Xc?Yc?Zc?1? ?= ?R11?R21?R31?0?R12?R22?R32?0?R13?R23?R33?0?T1?T2?T3?1? ? ?Xw?Yw?Zw?1? ?
其中這個(gè)變換矩陣(旋轉(zhuǎn)R和平移T)稱為相機(jī)外參
:
[ R 11 R 12 R 13 T 1 R 21 R 22 R 23 T 2 R 31 R 32 R 33 T 3 0 0 0 1 ] \begin{bmatrix} R_{11}&R_{12}&R_{13}&T_1\\ R_{21}&R_{22}&R_{23}&T_2\\ R_{31}&R_{32}&R_{33}&T_3\\ 0&0&0&1 \end{bmatrix} ?R11?R21?R31?0?R12?R22?R32?0?R13?R23?R33?0?T1?T2?T3?1? ?
相機(jī)外參實(shí)現(xiàn)了某點(diǎn)所在的世界坐標(biāo)系
到相機(jī)坐標(biāo)系
之間的轉(zhuǎn)換
2,相機(jī)坐標(biāo)系——圖像坐標(biāo)系
就此我們實(shí)現(xiàn)了世界坐標(biāo)系下點(diǎn) P w ( X w , Y w , Z w ) P_w(X_w,Y_w,Z_w) Pw?(Xw?,Yw?,Zw?)到其所對(duì)應(yīng)的相機(jī)的坐標(biāo)系下位置 P c ( X c , Y c , Z c ) P_c(X_c,Y_c,Z_c) Pc?(Xc?,Yc?,Zc?)之間的轉(zhuǎn)換
相機(jī)坐標(biāo)系是3D空間坐標(biāo)系,而相機(jī)拍出來的圖片是2D平面,這之間涉及透視投影(perspective projection),大白話為相似三角形
我們可以看到 X c , Y c , Z c , O c X_c,Y_c,Z_c,O_c Xc?,Yc?,Zc?,Oc?這個(gè)坐標(biāo)系為相機(jī)坐標(biāo)系,淡藍(lán)色的平面 x , y , o x,y,o x,y,o為圖像坐標(biāo)系(成像平面)
相機(jī)成像的原理是小孔成像,故相機(jī)坐標(biāo)系和圖像坐標(biāo)系的y軸是相反的
相機(jī)坐標(biāo)系的原點(diǎn) O c O_c Oc?與圖像坐標(biāo)系的原點(diǎn) o o o之間的距離為焦距 f f f(這里假設(shè)相機(jī)坐標(biāo)系和圖像坐標(biāo)系的軸是相互平行且放置位置為正中心,但也有不平行情況,就需要考慮角度了
)
相機(jī)坐標(biāo)系下的點(diǎn) P c ( X c , Y c , Z c ) P_c(X_c,Y_c,Z_c) Pc?(Xc?,Yc?,Zc?)與相機(jī)坐標(biāo)系原點(diǎn) O c O_c Oc?的連線過圖像坐標(biāo)系平面上的點(diǎn) p ( x , y ) p(x,y) p(x,y)
也就是相機(jī)坐標(biāo)系下的點(diǎn) P c ( X c , Y c , Z c ) P_c(X_c,Y_c,Z_c) Pc?(Xc?,Yc?,Zc?)對(duì)應(yīng)的圖像坐標(biāo)系下的位置為 p ( x , y ) p(x,y) p(x,y)
根據(jù)相似三角形可知:
{ x f = X c Z c y f = Y c Z c ? { Z c ? x = f ? X c Z c ? y = f ? Y c \begin{cases} \frac{x}{f} = \frac{X_c}{Z_c}\\ \frac{y}{f} = \frac{Y_c}{Z_c} \end{cases} \Rightarrow \begin{cases} Z_c·x = f·X_c\\ Z_c·y = f·Y_c \end{cases} {fx?=Zc?Xc??fy?=Zc?Yc????{Zc??x=f?Xc?Zc??y=f?Yc??
轉(zhuǎn)化為矩陣形式
Z c [ x y 1 ] = [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ X c Y c Z c 1 ] Z_c \begin{bmatrix} x\\y\\1\end{bmatrix} =\begin{bmatrix} f&0&0&0\\ 0&f&0&0\\ 0&0&1&0 \end{bmatrix} \begin{bmatrix} X_c\\ Y_c\\ Z_c\\ 1 \end{bmatrix} Zc? ?xy1? ?= ?f00?0f0?001?000? ? ?Xc?Yc?Zc?1? ?
其中 Z c Z_c Zc?為點(diǎn)所在相機(jī)坐標(biāo)系下的Z軸方向位置,是個(gè)常量,又稱為比例因子
f f f為相機(jī)的焦距
通過該矩陣就可以實(shí)現(xiàn)相機(jī)坐標(biāo)系
到圖像坐標(biāo)系
之間的轉(zhuǎn)換
3,圖像坐標(biāo)系——像素坐標(biāo)系
圖像坐標(biāo)系是物理坐標(biāo)系,因?yàn)樗婕暗骄唧w的尺寸大小,每個(gè)像素都有其對(duì)應(yīng)的物理尺寸
一般情況下像素是矩形,通常情況下假設(shè) 1 p i x e l = d x m m , 1 p i x e l = d y m m 1 pixel = dx mm,1 pixel = dy mm 1pixel=dxmm,1pixel=dymm,其中 d x dx dx和 d y dy dy表示一個(gè)像素的長(zhǎng)寬分別為多少mm
已知有個(gè)小藍(lán)點(diǎn)在圖像坐標(biāo)系
下的位置為 ( x , y ) (x,y) (x,y),圖像坐標(biāo)系原點(diǎn)所在像素坐標(biāo)系
下的位置為 ( u 0 , v 0 ) (u_0,v_0) (u0?,v0?)
求解:小藍(lán)點(diǎn)所對(duì)應(yīng)的像素坐標(biāo)系
為多少?
假設(shè):1個(gè)像素的長(zhǎng)和寬分別為 d x dx dx和 d y dy dy mm,圖像坐標(biāo)系下1mm對(duì)應(yīng)像素坐標(biāo)系下為 1 d x \frac{1}{dx} dx1?個(gè)像素
小藍(lán)點(diǎn)在圖像坐標(biāo)系下 ( x , y ) (x,y) (x,y)應(yīng)像素坐標(biāo)為 ( x ? 1 d x , y ? 1 d y ) (x * \frac{1}{dx} , y * \frac{1}{dy}) (x?dx1?,y?dy1?),即 ( x d x , y d y ) (\frac{x}{dx},\frac{y}{dy}) (dxx?,dyy?)
u = x d x + u 0 v = y d y + v 0 u = \frac{x}{dx} + u_0\\ v = \frac{y}{dy} + v_0 u=dxx?+u0?v=dyy?+v0?
整理成矩陣形式:
[ u v 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ x y 1 ] \begin{bmatrix} u\\ v\\ 1 \end{bmatrix} = \begin{bmatrix} \frac{1}{dx}&0&u_0\\ 0&\frac{1}{dy}&v_0\\ 0&0&1 \end{bmatrix} \begin{bmatrix} x\\ y\\ 1 \end{bmatrix} ?uv1? ?= ?dx1?00?0dy1?0?u0?v0?1? ? ?xy1? ?
也可以寫成另一種形式
[ x y 1 ] = [ d x 0 ? u 0 d x 0 d y ? v 0 d y 0 0 1 ] [ u v 1 ] \begin{bmatrix} x\\ y\\ 1 \end{bmatrix} = \begin{bmatrix} dx&0&-u_0dx\\ 0&dy&-v_0dy\\ 0&0&1 \end{bmatrix} \begin{bmatrix} u\\ v\\ 1 \end{bmatrix} ?xy1? ?= ?dx00?0dy0??u0?dx?v0?dy1? ? ?uv1? ?
由此可以得到一個(gè)矩陣,實(shí)現(xiàn)該點(diǎn)在圖像坐標(biāo)系 ( x , y ) (x,y) (x,y)和像素坐標(biāo)系 ( u , v ) (u,v) (u,v)下的直接轉(zhuǎn)換
4,各個(gè)坐標(biāo)系轉(zhuǎn)換相互推導(dǎo)結(jié)合
我們的最終目的是:世界坐標(biāo)系
轉(zhuǎn)換到像素坐標(biāo)系
若已知世界坐標(biāo)系下點(diǎn)的坐標(biāo)為 P w ( X w , Y w , Z w ) P_w(X_w,Y_w,Z_w) Pw?(Xw?,Yw?,Zw?)
將世界坐標(biāo)系 P w ( X w , Y w , Z w ) P_w(X_w,Y_w,Z_w) Pw?(Xw?,Yw?,Zw?)轉(zhuǎn)換為相機(jī)坐標(biāo)系 P c ( X c , Y c , Z c ) P_c(X_c,Y_c,Z_c) Pc?(Xc?,Yc?,Zc?)
[ X c Y c Z c 1 ] = [ R 11 R 12 R 13 T 1 R 21 R 22 R 23 T 2 R 31 R 32 R 33 T 3 0 0 0 1 ] [ X w Y w Z w 1 ] \begin{bmatrix} X_c\\ Y_c\\ Z_c\\ 1 \end{bmatrix}= \begin{bmatrix} R_{11}&R_{12}&R_{13}&T_1\\ R_{21}&R_{22}&R_{23}&T_2\\ R_{31}&R_{32}&R_{33}&T_3\\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} X_w\\ Y_w\\ Z_w\\ 1 \end{bmatrix} ?Xc?Yc?Zc?1? ?= ?R11?R21?R31?0?R12?R22?R32?0?R13?R23?R33?0?T1?T2?T3?1? ? ?Xw?Yw?Zw?1? ?
將相機(jī)坐標(biāo)系 P c ( X c , Y c , Z c ) P_c(X_c,Y_c,Z_c) Pc?(Xc?,Yc?,Zc?)轉(zhuǎn)化為圖像坐標(biāo)系 p ( x , y ) p(x,y) p(x,y)
Z c [ x y 1 ] = [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ X c Y c Z c 1 ] Z_c \begin{bmatrix} x\\y\\1\end{bmatrix} =\begin{bmatrix} f&0&0&0\\ 0&f&0&0\\ 0&0&1&0 \end{bmatrix} \begin{bmatrix} X_c\\ Y_c\\ Z_c\\ 1 \end{bmatrix} Zc? ?xy1? ?= ?f00?0f0?001?000? ? ?Xc?Yc?Zc?1? ?
將圖像坐標(biāo)系 ( x , y ) (x,y) (x,y)轉(zhuǎn)化為像素坐標(biāo)系 ( u , v ) (u,v) (u,v),這里的 ( u 0 , v 0 ) (u_0,v_0) (u0?,v0?)是圖像坐標(biāo)系的原點(diǎn)所對(duì)應(yīng)的像素坐標(biāo)系下的位置
[ u v 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ x y 1 ] \begin{bmatrix} u\\ v\\ 1 \end{bmatrix} = \begin{bmatrix} \frac{1}{dx}&0&u_0\\ 0&\frac{1}{dy}&v_0\\ 0&0&1 \end{bmatrix} \begin{bmatrix} x\\ y\\ 1 \end{bmatrix} ?uv1? ?= ?dx1?00?0dy1?0?u0?v0?1? ? ?xy1? ?
最終進(jìn)行前后整理可得:
Z c [ u v 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ R 11 R 12 R 13 T 1 R 21 R 22 R 23 T 2 R 31 R 32 R 33 T 3 0 0 0 1 ] [ X w Y w Z w 1 ] Z_c \begin{bmatrix} u\\ v\\ 1 \end{bmatrix} = \begin{bmatrix} \frac{1}{dx}&0&u_0\\ 0&\frac{1}{dy}&v_0\\ 0&0&1 \end{bmatrix} \begin{bmatrix} f&0&0&0\\ 0&f&0&0\\ 0&0&1&0 \end{bmatrix} \begin{bmatrix} R_{11}&R_{12}&R_{13}&T_1\\ R_{21}&R_{22}&R_{23}&T_2\\ R_{31}&R_{32}&R_{33}&T_3\\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} X_w\\ Y_w\\ Z_w\\ 1 \end{bmatrix} Zc? ?uv1? ?= ?dx1?00?0dy1?0?u0?v0?1? ? ?f00?0f0?001?000? ? ?R11?R21?R31?0?R12?R22?R32?0?R13?R23?R33?0?T1?T2?T3?1? ? ?Xw?Yw?Zw?1? ?
其中 Z c Z_c Zc?表示該點(diǎn)在相機(jī)坐標(biāo)系下的Z軸方向的位置,又稱為比例因子,本質(zhì)是常量
相機(jī)內(nèi)參為:
[ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] \begin{bmatrix} \frac{1}{dx}&0&u_0\\ 0&\frac{1}{dy}&v_0\\ 0&0&1 \end{bmatrix} \begin{bmatrix} f&0&0&0\\ 0&f&0&0\\ 0&0&1&0 \end{bmatrix} ?dx1?00?0dy1?0?u0?v0?1? ? ?f00?0f0?001?000? ?
相機(jī)外參為:
[ R 11 R 12 R 13 T 1 R 21 R 22 R 23 T 2 R 31 R 32 R 33 T 3 0 0 0 1 ] \begin{bmatrix} R_{11}&R_{12}&R_{13}&T_1\\ R_{21}&R_{22}&R_{23}&T_2\\ R_{31}&R_{32}&R_{33}&T_3\\ 0&0&0&1 \end{bmatrix} ?R11?R21?R31?0?R12?R22?R32?0?R13?R23?R33?0?T1?T2?T3?1? ?
就此我們實(shí)現(xiàn)了世界坐標(biāo)系和像素坐標(biāo)系的轉(zhuǎn)換,這就是相機(jī)標(biāo)定的意義所在
5,總結(jié)
理想狀態(tài)下的相機(jī)標(biāo)定,其本質(zhì)是求解相機(jī)的內(nèi)外參數(shù)矩陣
相機(jī)外參矩陣需要求解旋轉(zhuǎn)和平移共6個(gè)參數(shù)
相機(jī)內(nèi)參菊展需要求解焦距 f f f、圖像坐標(biāo)系原點(diǎn)所在的像素坐標(biāo)系的坐標(biāo) ( u 0 , v 0 ) (u_0,v_0) (u0?,v0?)也稱為像主點(diǎn)坐標(biāo)、單個(gè)像素點(diǎn)的長(zhǎng)和寬 d x dx dx和 d y dy dy mm,共5個(gè)參數(shù)
相機(jī)內(nèi)外參數(shù)矩陣需要求解11
個(gè)參數(shù),這是不考慮畸變的理想狀況,但實(shí)際相機(jī)都不可避免存在畸變,故還需要求解畸變系數(shù)
三、畸變
相機(jī)標(biāo)定的最終目的是拿到相機(jī)的內(nèi)外參數(shù)矩陣,這些內(nèi)外參數(shù)針對(duì)同一個(gè)相機(jī)是固定的,只需要標(biāo)定一次即可
相機(jī)硬件本身多多少少不可避免存在一定的誤差,故需要求解畸變系數(shù)用于相機(jī)的校準(zhǔn),然后再進(jìn)行求解內(nèi)外參矩陣
畸變主要包括(影響最大):切向畸變
和徑向畸變
,是相機(jī)本身無法避免的誤差
1,切向畸變
切向畸變產(chǎn)生于相機(jī)組裝過程中,透鏡本身與相機(jī)傳感器成像平面不平行
2,徑向畸變
徑向畸變產(chǎn)生于透鏡本身的形狀,光線在遠(yuǎn)離透鏡中心的地方比靠近中心的地方更加彎曲
徑向畸變主要包括:桶形畸變
和枕形畸變
切向畸變和徑向畸變有對(duì)應(yīng)的模型公式,網(wǎng)上一大堆教程,需要的小伙伴自行學(xué)習(xí)推導(dǎo)哈
畸變涉及到五個(gè)參數(shù):徑向畸變參數(shù) k 1 、 k 2 、 k 3 k_1、k_2、k_3 k1?、k2?、k3?;切向畸變參數(shù) p 1 、 p 2 p_1、p_2 p1?、p2?
四、OpenCV代碼實(shí)戰(zhàn)
求解方法很多,這里以張正友標(biāo)定法(也稱為棋盤格標(biāo)定法)為例進(jìn)行演示
1,準(zhǔn)備棋盤格數(shù)據(jù)
①OpenCV自帶幾張棋盤格圖片,大致路徑為:opencv\sources\samples\data
,當(dāng)然也可以自己去拍幾張棋盤格
把這幾張圖片放到VS項(xiàng)目中
②新建一個(gè)項(xiàng)目,需要用到OpenCV
③跑一下代碼即可
2,完整代碼
修改地方:
①棋盤格角點(diǎn)行列數(shù):int CHECKERBOARD[2]{ 6,9 };
②圖片所在文件夾路徑:std::string path = "./image/*.jpg";
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <iostream>using namespace std;
using namespace cv;// Defining the dimensions of checkerboard
// 定義棋盤格的尺寸
int CHECKERBOARD[2]{ 6,9 }; // 一行有6個(gè),一共有9行 數(shù)點(diǎn)的行列---6行9列int main()
{// Creating vector to store vectors of 3D points for each checkerboard image// 創(chuàng)建矢量以存儲(chǔ)每個(gè)棋盤圖像的三維點(diǎn)矢量std::vector<std::vector<cv::Point3f> > objpoints;// Creating vector to store vectors of 2D points for each checkerboard image// 創(chuàng)建矢量以存儲(chǔ)每個(gè)棋盤圖像的二維點(diǎn)矢量std::vector<std::vector<cv::Point2f> > imgpoints;// Defining the world coordinates for 3D points// 為三維點(diǎn)定義世界坐標(biāo)系std::vector<cv::Point3f> objp;for (int i{ 0 }; i < CHECKERBOARD[1]; i++){for (int j{ 0 }; j < CHECKERBOARD[0]; j++){objp.push_back(cv::Point3f(j, i, 0));}}// Extracting path of individual image stored in a given directory// 提取存儲(chǔ)在給定目錄中的單個(gè)圖像的路徑std::vector<cv::String> images;// Path of the folder containing checkerboard images// 包含棋盤圖像的文件夾的路徑std::string path = "./image/*.jpg";// 使用glob函數(shù)讀取所有圖像的路徑cv::glob(path, images);cv::Mat frame, gray;// vector to store the pixel coordinates of detected checker board corners// 存儲(chǔ)檢測(cè)到的棋盤轉(zhuǎn)角像素坐標(biāo)的矢量std::vector<cv::Point2f> corner_pts;bool success;// Looping over all the images in the directory// 循環(huán)讀取圖像for (int i{ 0 }; i < images.size(); i++){frame = cv::imread(images[i]);if (frame.empty()){continue;}if (i == 40){int b = 1;}cout << "the current image is " << i << "th" << endl;cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);// Finding checker board corners// 尋找角點(diǎn)// If desired number of corners are found in the image then success = true// 如果在圖像中找到所需數(shù)量的角,則success = true// opencv4以下版本,flag參數(shù)為CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FAST_CHECK | CV_CALIB_CB_NORMALIZE_IMAGEsuccess = cv::findChessboardCorners(gray, cv::Size(CHECKERBOARD[0], CHECKERBOARD[1]), corner_pts, CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_FAST_CHECK | CALIB_CB_NORMALIZE_IMAGE);/** If desired number of corner are detected,* we refine the pixel coordinates and display* them on the images of checker board*/// 如果檢測(cè)到所需數(shù)量的角點(diǎn),我們將細(xì)化像素坐標(biāo)并將其顯示在棋盤圖像上if (success){// 如果是OpenCV4以下版本,第一個(gè)參數(shù)為CV_TERMCRIT_EPS | CV_TERMCRIT_ITERcv::TermCriteria criteria(TermCriteria::EPS | TermCriteria::Type::MAX_ITER, 30, 0.001);// refining pixel coordinates for given 2d points.// 為給定的二維點(diǎn)細(xì)化像素坐標(biāo)cv::cornerSubPix(gray, corner_pts, cv::Size(11, 11), cv::Size(-1, -1), criteria);// Displaying the detected corner points on the checker board// 在棋盤上顯示檢測(cè)到的角點(diǎn)cv::drawChessboardCorners(frame, cv::Size(CHECKERBOARD[0], CHECKERBOARD[1]), corner_pts, success);objpoints.push_back(objp);imgpoints.push_back(corner_pts);}cv::imshow("Image", frame);cv::waitKey(0);}cv::destroyAllWindows();cv::Mat cameraMatrix, distCoeffs, R, T;/** Performing camera calibration by* passing the value of known 3D points (objpoints)* and corresponding pixel coordinates of the* detected corners (imgpoints)*/// 通過傳遞已知3D點(diǎn)(objpoints)的值和檢測(cè)到的角點(diǎn)(imgpoints)的相應(yīng)像素坐標(biāo)來執(zhí)行相機(jī)校準(zhǔn)cv::calibrateCamera(objpoints, imgpoints, cv::Size(gray.rows, gray.cols), cameraMatrix, distCoeffs, R, T);// 內(nèi)參矩陣std::cout << "cameraMatrix : " << std::endl;std::cout << cameraMatrix << std::endl;// 透鏡畸變系數(shù)std::cout << "distCoeffs : " << std::endl;std::cout << distCoeffs << std::endl;// rvecsstd::cout << "Rotation vector : " << std::endl;std::cout << R << std::endl;// tvecsstd::cout << "Translation vector : " << std::endl;std::cout << T << std::endl;return 0;
}
3,運(yùn)行效果
求解得到內(nèi)參矩陣
、透鏡畸變系數(shù)
、旋轉(zhuǎn)和平移向量