函式形式
C++: 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 )
參數
o cameraMatrix1– 第一個相機矩陣.
o distCoeffs1– 第一個相機畸變參數.
o cameraMatrix2– 第二個相機矩陣.
o distCoeffs2– 第二個相機畸變參數.
o imageSize– 用於校正的圖像大小.
o R– 第一和第二相機坐標系之間的旋轉矩陣。
o T– 第一和第二相機坐標系之間的平移矩陣.
o R1– 輸出第一個相機的3x3矯正變換(旋轉矩陣) .
o R2– 輸出第二個相機的3x3矯正變換(旋轉矩陣) .
o P1–在第一台相機的新的坐標系統(矯正過的)輸出 3x4 的投影矩陣
o P2–在第二台相機的新的坐標系統(矯正過的)輸出 3x4 的投影矩陣
o Q–輸出深度視差映射矩陣,如下:
矩陣Q是一個任意提供的矩陣(比如, stereoRectify()所能得出的矩陣).
o flags– 操作的 flag可以是零或者是CV_CALIB_ZERO_DISPARITY . 如果設定了CV_CALIB_ZERO_DISPARITY,函式的作用是使每個相機的主點在校正後的圖像上有相同的像素坐標。如果未設定標誌,功能還可以改變圖像在水平或垂直方向(取決於極線的方向)來最大化有用的圖像區域。
o alpha– 自由縮放參數。如果是-1或沒有,該函式執行默認縮放。否則,該參數應在0和1之間。alpha=0,校正後的圖像進行縮放和偏移,只有有效像素是可見的(校正後沒有黑色區域)。alpha= 1意味著校正圖像的抽取和轉移,所有相機原始圖像素像保留在校正後的圖像(源圖像像素沒有丟失)。顯然,任何中間值產生這兩種極端情況之間的中間結果。
o newImageSize– 校正後新的圖像解析度。相同的尺寸應傳遞給initUndistortRectifyMap()(見OpenCV樣品目錄stereo_calib.cpp樣品)。當(0,0)傳遞(默認),它設定為原始圖像大小。設定為較大的值能幫助你保存原始圖像的細節,特別是當有一個大的徑向畸變時。
o validPixROI1– 校正後的圖像可選的輸出矩形,裡面所有像素都是有效的。如果alpha= 0,ROIs覆蓋整個圖像。否則,他們可能會比較小。
o validPixROI2– 校正後的圖像可選的輸出矩形,裡面所有像素都是有效的。如果alpha= 0,ROIs覆蓋整個圖像。否則,他們可能會比較小。
說明
函式為每個相機計算出旋轉矩陣,(幾乎)使攝像機圖像平面位於同一平面。因此,這使得所有極線平行,從而簡化了密集的立體匹配問題。該函式使用stereocalibrate()的結算結果矩陣作為輸入矩陣。作為輸出,它在新的坐標提供兩個旋轉矩陣和兩個投影矩陣。功能分以下兩種情況:
Horizontal stereo(水平立體): 第一和第二相機視圖相對於彼此偏移主要沿X軸(以儘可能小的垂直移位)。在校正後的圖像,在左右攝像機的對應極線是平行的,具有相同的y坐標。P1和P2如下:
是相機之間的水平位移。如果設定了CV_CALIB_ZERO_DISPARITY,
Vertical stereo(垂直立體): 第一和第二相機視圖的相對移動,主要是在垂直方向上彼此(也許一點在水平方向)。在校正後的圖像的極線是垂直的,具有相同的橫坐標。P1 和 P2 如下:
是兩個相機之間的垂直位移。如果設定了CALIB_ZERO_DISPARITY, .
如你所見,P1和P2的前三列將有效地成為新的“校正”相機矩陣。這個矩陣,連同R1和R2,然後可以傳遞給initundistortrectifymap()為每個相機初始化校正圖像。