2017-07-20 70 views
2

我的立體相機的分辨率不同,分辨率爲1280x480,640x240和320x120。 (相機流同步對圖像640X480水平粘貼,這就是爲什麼是1280x480)。在立體聲校準中,如果更改立體相機的分辨率,外置矩陣如何變化

我已經在以下link中使用了Opencv3立體校準算法來校準分辨率爲1280 * 480的立體相機。

stereoRectify(M1, D1, M2, D2, img_size, R, T, R1, R2, P1, P2, Q, CALIB_ZERO_DISPARITY, -1, img_size, &roi1, &roi2); 
    Mat map11, map12, map21, map22; 
    initUndistortRectifyMap(M1, D1, R1, P1, img_size, CV_16SC2, map11, map12); 
    initUndistortRectifyMap(M2, D2, R2, P2, img_size, CV_16SC2, map21, map22); 

    Mat img1r, img2r; 
    remap(img1, img1r, map11, map12, INTER_LINEAR); 
    remap(img2, img2r, map21, map22, INTER_LINEAR); 

stereoRectify計算左和右相機之間的旋轉矩陣R,平移矩陣T。並且,它計算兩個旋轉矩陣R1,R2和兩個投影矩陣P1 P2。我使用了stereoRectify的輸出作爲initUndistortRectifyMap的輸入,然後重新映射以應用投影。

這是一個stackoverflow答案來解釋如何做到這一點。

現在我已經得到了左映射11,映射12和右映射映射21,映射22的整形映射的兩個矩陣。但現在我想使用這些相機矩陣M1和M2,失真矩陣D1和D2以及外在矩陣R,T,R1,R2,P1和P2來以較低分辨率(320x120)對圖像進行糾正。 PS我沒有用320 * 120的分辨率直接校準相機,因爲圖像太小,Opencv的算法找不到棋盤角落來執行校準。我知道「失真係數並不取決於觀看的場景,因此它們也屬於固有的相機參數,而且不管拍攝的圖像分辨率如何,它們都保持不變,例如,如果相機具有已經在320 x 240分辨率的圖像上進行了校準,對於來自同一相機的640 x 480圖像,可以使用完全相同的失真係數,而f_x,f_y,c_x和c_y需要適當縮放。「 根據the documentation of opencv。 (我測試過,它正在工作)

我想知道:我應該如何修改R,T,R1,R2,P1,P2的矩陣以從1280x480到320x120的較低分辨率進行重映射?

回答

0

其實 我改變了P1和P2的矩陣,它們是相機固有矩陣和相機平移矩陣的組合。

我只是將它們除以4使用320x120。的通式爲:

FX '=(dimx'/ dimx)* FX

FY '=(dimy'/ dimy)* FY

FX」是爲新分辨率,FX值是您原始分辨率已有的值,dimx'是沿x軸的新分辨率,dimx是原始分辨率。這同樣適用於fy。

cx和cy的計算過程類似,因爲所有這些值均以像素座標表示。

-1

多玩弄不僅P1P2應縮放後,還要0​​和M2(OP中的代碼)。

請記住,縮放比例只是左側縮放矩陣的兩個第一對角線條目,並將第三個縮放矩陣保留爲1.

相關問題