首先,先看看OpenCV提供的標定接口:
opencv函數:
double calibrateCamera(
InputArrayOfArrays objectPoints, //輸入:目標點位 的集合的集合
InputArrayOfArrays imagePoints, //輸入:圖像點位 的集合的集合
Size imageSize, //輸入:圖像尺寸
InputOutputArray cameraMatrix, //輸出:相機內參矩陣(fx,fy,cx,cy)
InputOutputArray distCoeffs, //輸出:畸變矯正多項式(k1,k2,p1,p2,k3...)
OutputArrayOfArrays rvecs, //輸出:旋轉矩陣 的集合
OutputArrayOfArrays tvecs, //輸出:平移矩陣 的集合
int flags = 0, //輸入:對標定過程方法進行更精細的控制
TermCriteria criteria = //輸入:迭代參數
TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 30, DBL_EPSILON));
計算流程大概分爲以下兩步:
1.通過大量的對應點: 物體的目標點(現實世界)和 物體投影點(圖片中)計算出內參矩陣和畸變矯正多項式
2.再以得到的內參矩陣和畸變矯正多項式和輸入數據,進行迭代修正。得到更好的輸出結果。
以下是參數詳細解析:
參數一:InputArrayOfArrays:objectPoints,輸入目標點的位置 的集合的集合。
其每個點位代表着物體的三維座標。
參數類型可爲 :vector<vector<cv::Point3_<someType>>>
參數二:InputArrayOfArrays:imagePoints,圖像點位 的集合的集合
其每個點,是objectPoints中的點投影在圖片中成像的對應點。
參數類型可爲 :vector<vector<cv::Point2_<someType>>>
PS:objectPoints和imagePoints數組大小和每個數組的數組大小應該一致,且每個點一一對應。
參數三:Size:imageSize 圖像尺寸
參數四:InputOutputArray: cameraMatrix 相機內參矩陣
如圖:其中fx,fy分別爲x/y方向的焦距,cx,cy爲光軸對於投影平面座標中心的偏移量
該參數固定以3x3雙精度類Mat類型返回。
可配合cv::getOptimalNewCameraMatrix()函數使用,解決矯正後邊緣像素爲空問題
Ps1:當flags設置有固定中心(即:cv::CALIB_FIX_PRINCIPAL_POINT)時,固定光軸主點爲圖像中心。
Ps2:當flags設置有固定中心(即:cv::CALIB_FIX_PRINCIPAL_POINT | cv::CALIB_USE_INTRINSIC_GUESS)時,
直接使用傳入光軸偏移量cx,cy計算。
Ps3:當flags設置有固定焦距(即:cv::CALIB_FIX_FOCAL_LENGTH)時,直接使用傳入焦距fx,fy計算。
參數五:InputOutputArray distCoeffs 畸變矯正多項式(k1,k2,p1,p2,k3....k6)
其中k1,k2.....k6 爲泰勒級數展開的係數 用於矯正透鏡造成的徑向畸變
p1,p2 用於矯正透鏡切向畸變造成的畸變(可參考鉛錘模型)
該參數固定以雙精度類Mat類型返回。
默認返回k1,k2,p1,p2,k3。需要k4,k5,k6時可設置flags爲:CV_CALIB_RATIONAL_MODEL(一般只用於魚眼鏡頭)
ps::可通過設置cv::CALIB_FIX_Kn來固定對應的Kn在迭代修正過程中保持不變。
參數六:OutputArrayOfArrays rvecs 旋轉矩陣 的集合
類型可爲Vector<cv::Mat> ,其中每個Mat 爲1x3的Rodrigues表現的空間旋轉矩陣。
參數七:OutputArrayOfArrays tvecs 平移矩陣 的集合
類型可爲Vector<cv::Mat> ,其中每個Mat 爲1x3的平移矩陣。
參數七:int flags 對標定過程方法進行更精細的控制
除上述flags外還有:
CALIB_FIX_ASPECT_RATIO:修正過程中 fx,fy的比值不變。(若CV_CALIB_USE_INTRINSIC_GUESS被設置,則只更改fy值)
CALIB_ZERO_TANGENT_DIST:設置切向畸變爲0;
參數八:TermCriteria criteria 迭代參數
TermCriteria 類有三個成員 (int type,int maxCount,double epsilon)
分別是 迭代類型(翻譯爲迭代終止條件更符合),最大迭代次數,期望精度
迭代類型有:COUNT, EPS or COUNT + EPS (滿足次數,滿足精度,或兩者之一)
返回值:重投影的均方根誤差