StereoRectify()函数定义及用法畸变矫正与立体校正
?
畸變矯正是上一篇博文的遺留問題,當畸變系數和內外參數矩陣標定完成后,就應該進行畸變的矯正,以達到消除畸變的目的,此其一。
在該系列第一部分的博文中介紹的立體成像原理中提到,要通過兩幅圖像估計物點的深度信息,就必須在兩幅圖像中準確的匹配到同一物點,這樣才能根據該物點在兩幅圖像中的位置關系,計算物體深度。為了降低匹配的計算量,兩個攝像頭的成像平面應處于同一平面。但是,單單依靠嚴格的擺放攝像頭來達到這個目的顯然有些困難。立體校正就是利用幾何圖形變換(Geometric Image Transformation)關系,使得原先不滿足上述位置關系的兩幅圖像滿足該條件,此其二。
數學原理
- 畸變矯正(compensate lens distortion)
畸變矯正的方法就是用上一篇博文給出的公式對像素位置進行重新映射。這里重新寫出重新映射的公式。
先矯正徑向畸變,
再矯正切向畸變,
- 立體矯正(stereo rectify)
立體矯正能夠有效降低立體匹配的計算量,立體矯正的具體作用見下圖,
立體矯正前,
立體矯正后,
立體矯正的算法原理沒有詳細了解,此處從略。
OpenCV相關函數說明
- 畸變矯正函數?undistort()?
?undistort()?是獨立的一個畸變矯正函數,一次性可以完成映射矩陣的求解和重新映射。下面我們還會看到把這兩步分開來做的函數。
調用方法,
?
- 立體標定函數?stereoCalibrate()?
?stereoCalibrate()?是用來標定一個立體攝像頭的,也就是同時標定兩個攝像頭。標定的結果除了能夠求出兩個攝像頭的內外參數矩陣,跟能夠得出兩個攝像頭的位置關系R,T。
調用方法,
double stereoCalibrate(InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints1,InputArrayOfArrays imagePoints2, InputOutputArray cameraMatrix1,InputOutputArray distCoeffs1, InputOutputArray cameraMatrix2, InputOutputArray distCoeffs2, Size imageSize, OutputArray R,OutputArray T, OutputArray E, OutputArray F, TermCriteria criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 1e-6), intflags=CALIB_FIX_INTRINSIC )?
flag-
- ?CV_CALIB_FIX_INTRINSIC?如果該標志被設置,那么就會固定輸入的cameraMatrix和distCoeffs不變,只求解
$R,T,E,F
- $.
- ?CV_CALIB_USE_INTRINSIC_GUESS?根據用戶提供的cameraMatrix和distCoeffs為初始值開始迭代
- ?CV_CALIB_FIX_PRINCIPAL_POINT?迭代過程中不會改變主點的位置
- ?CV_CALIB_FIX_FOCAL_LENGTH?迭代過程中不會改變焦距
- ?CV_CALIB_SAME_FOCAL_LENGTH?強制保持兩個攝像機的焦距相同
- ?CV_CALIB_ZERO_TANGENT_DIST?切向畸變保持為零
- ?CV_CALIB_FIX_K1,...,CV_CALIB_FIX_K6?迭代過程中不改變相應的值。如果設置了?CV_CALIB_USE_INTRINSIC_GUESS?將會使用用戶提供的初始值,否則設置為零
- ?CV_CALIB_RATIONAL_MODEL?畸變模型的選擇,如果設置了該參數,將會使用更精確的畸變模型,distCoeffs的長度就會變成8
- 立體校正函數?stereoRectify()?
?stereoRectify()?的作用是為每個攝像頭計算立體校正的映射矩陣。所以其運行結果并不是直接將圖片進行立體矯正,而是得出進行立體矯正所需要的映射矩陣。
調用方法,
void stereoRectify(InputArray cameraMatrix1, InputArray distCoeffs1, InputArray cameraMatrix2,InputArray distCoeffs2, Size imageSize, InputArray R, InputArray T,OutputArray R1, OutputArray R2, OutputArray P1, OutputArray P2, OutputArray Q, int flags=CALIB_ZERO_DISPARITY, double alpha=-1, Size newImageSize=Size(), Rect* validPixROI1=0, Rect* validPixROI2=0 )?
- 映射變換計算函數?initUndistortRectifyMap()?
該函數功能是計算畸變矯正和立體校正的映射變換。
調用方法,
void initUndistortRectifyMap(InputArray cameraMatrix, InputArray distCoeffs, InputArray R,InputArray newCameraMatrix, Size size, int m1type, OutputArray map1, OutputArray map2)?
- 幾何變換函數?remap()?
調用方法,
void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation,int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())?
基于OpenCV的仿真
- 仿真程序
View Code
?
子函數calibrate()和calcChessboardCorners()分別是用來表達相機和計算objectPoints的。函數體如下,
View Code
?
1 static void calcChessboardCorners(Size boardSize, float squareSize, vector<Point3f>& corners) 2 { 3 corners.resize(0); 4 for (int i = 0; i < boardSize.height; i++) //height和width位置不能顛倒 5 for (int j = 0; j < boardSize.width; j++) 6 { 7 corners.push_back(Point3f(j*squareSize, i*squareSize, 0)); 8 } 9 }?
- 仿真結果
分類: Computer Vision,OpenCV,數字圖像處理
標簽: opencv, Computer Vision
總結
以上是生活随笔為你收集整理的StereoRectify()函数定义及用法畸变矫正与立体校正的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python opencv立体测距 立
- 下一篇: ECMAScript 实现继承的几种方式