雙目標定(二)單目標定基本原理
主體思路,先處理純二維平面的畸變問題(此處略過),矯正圖片後,再來求解相機內外引數。基本思路是求得每個標定板對應的單應矩陣,再聯合優化所有標定板資料得到相機內參矩陣,再得到每個標定板對應的外參。
1. 標定板平面到像平面的單應矩陣H
,則對於每個棋盤格,可以得到一個標定板平面到當前影象平面的單應矩陣Hi,實際上這個單應矩陣Hi彙總了標定板平面到相機成像平面的旋轉平移以及相機內參資訊。
現在,我們已知每幅標定板圖的單應矩陣H
2.求解相機內參矩陣
對一幅標定板圖片上的標定板座標上的一點由於
(1)
A為相機內參
實際上,由於H是二維對應關係,而標定板平面Z軸對應為0,所以:,
由於R是正交矩陣,所以r1,r2正交,即r1和r2的模相同,而且點積為0,即:
用h1,h2,替換r1,r2,則有:
令,則可以將上述式子化簡為:
B是對稱矩陣,所以可以用6個元素表示B的有效元素,則上述式子又可以表示為:
因此之前由r1,r2正交得到的式子可以轉化為:
將所有標定板影象都壓棧到一起,最小二乘法可以求出b。
求得b,也就是求出B,也即得到內參矩陣A。
3. 求解每個 標定板對應的外引數
根據第一個式子轉換得到:
其中:
就得到每個標定板平面座標系對相機座標系的旋轉平移向量
4.最小二乘解最終的內參矩陣
通過以上方式得到最初的A和後,考慮到觀測時不可避免的噪聲,所以用最小二乘方法,將所有N張圖上每張圖d個點的觀測量用最小二乘方法解:
其中為(1),即投影矩陣。
用高斯牛頓法對以上進行求解。
此處,之前的格點大小就派上用場了,比如OpenCV中認為左上角的格點為b標定板平面座標系的原點,則其他格點的三維座標依次是:
5.考慮畸變
一般情況下,我們先計算畸變雙目標定(一)單目標定與矯正的基本介紹,然後再通過4的最小二乘估計內參矩陣。但正如張定友論文中[1]所介紹的,這種方法的收斂速度太小,所以他提出直接最小二乘求解以下包括徑向畸變、內參和在內的所有引數(他不考慮切向畸變)。其中內參和的初始估計可用3部分的方法得到,而徑向畸變可用普通徑向畸變方法求解,或者直接令為0.
6.單目標定的整個流程
- 拍攝一系列含有標定板的影象
- 找出影象中的角點/格點
- 得到每張影象格點之間的匹配關係
- 求解最初的相機內參A和標定板座標系到世界座標系的旋轉平移
- 得到徑向畸變(和切向畸變)
- 再次最小二乘聯合優化內參A和
7.雙目標定流程
雙目標定先得到在左側標定板座標系中各個格點位置,通過左側相機的轉換到相機座標系,再根據轉換到右側相機座標系,並使得兩側的投影誤差最小。在OpenCV的實現中,也是用高斯牛頓法的最小二乘方法來優化最後的結果。
for( i = 0; i < nimages; i++ )
{
for( j = 0; j < boardSize.height; j++ )
for( k = 0; k < boardSize.width; k++ )
objectPoints[i].push_back(Point3f(k*squareSize, j*squareSize, 0));
}
///...
double rms = stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1],
cameraMatrix[0], distCoeffs[0],
cameraMatrix[1], distCoeffs[1],
imageSize, R, T, E, F,
CALIB_FIX_ASPECT_RATIO +
CALIB_ZERO_TANGENT_DIST +
CALIB_USE_INTRINSIC_GUESS +
CALIB_SAME_FOCAL_LENGTH +
CALIB_RATIONAL_MODEL +
CALIB_FIX_K3 + CALIB_FIX_K4 + CALIB_FIX_K5,
TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 100, 1e-5) );
Reference
Zhang Z. A flexible new technique for camera calibration[J]. IEEE Transactions on pattern analysis and machine intelligence, 2000, 22(11): 1330-1334.