2012-12-13 163 views
6

我目前正在爲一對立體相機編寫一個openCV程序。 攝像機校準以及立體聲校準完成。InitUndistortRectifyMap和Remap

下一步是從我得到的2張圖像中找到一個要素在空間中的位置。這就是爲什麼我必須立體聲矯正圖像並在之後進行計算。

我與initUndistortRectifyMap面臨的問題如下:

- 如果我通過R1或R2通過stereoRectify()initUndistortRectifyMap()我重新映射之後得到的黑色圖像計算。

- 如果我傳遞r(一個空矩陣)到initUndistortRectifyMap()我在重新映射後得到未校正的圖像。我得到的圖像雖然有點扭曲。

我需要通過R1和R2到initUndistortRectifyMap()來校正2個攝像頭,否則當傳遞空矩陣時,立體頭不會旋轉到同一個平面。

以下是我的代碼:

stereoRectify(intrinsic[0], distCoeffs[0], intrinsic[1], distCoeffs[1], imageSize, 
    R, T_Stereo, R1, R2, newP1, newP2, Q, CV_CALIB_ZERO_DISPARITY, -1, imageSize); 

if (x_Cam.GetSerial()=="4002678487") 
{ 
    initUndistortRectifyMap(intrinsic[0], distCoeffs[0], R1, newP1, imageSize,   
     CV_16SC2 , mapx1, mapy1); 
    remap(x_Image, imageRectified[0],mapx1, mapy1, INTER_LINEAR); 

    return imageRectified[0]; 
} 

if (x_Cam.GetSerial()=="4002702131") 
{ 
    //flip(in, in, -1); 
    initUndistortRectifyMap(intrinsic[1], distCoeffs[1], R2, newP2, imageSize, 
     CV_16SC2 , mapx2, mapy2); 
    remap(x_Image, imageRectified[1],mapx2, mapy2, INTER_LINEAR, BORDER_CONSTANT, 0); 

    return imageRectified[1]; 
} 

我檢查所有矩陣值將在以stereoRectify(),他們是正確的。旋轉矩陣R1和R2似乎也是正確的。我只是將黑色圖像作爲輸出。

我試着將R1和R2(例如R1 * R2)的垃圾值傳遞給InitUndistortRectifyMap()來簡單地看到效果,我確實得到了奇怪的結果而不是黑色的圖像。

+2

我假設你的問題是:「爲什麼'initUndistortRectifyMap()'返回黑色圖像,而不僅僅是奇怪的結果?下次嘗試明確你的具體問題。 –

+0

你需要校準攝像頭,然後才能使用'initUndistortRectifyMap()',顯然你還沒有這樣做。請在校準相機的地方發佈代碼:http://www.aishack.in/2010/07/calibrating-undistorting-with-opencv-in-c-oh-yeah/ –

+0

單臺攝像機的校準以及兩臺攝像機與StereoCalibrate()一起使用。我已經檢查了StereoCalibratoin中的R和T矩陣,它們是正確的。 – user1901213

回答

7

那麼,我有點繞過這個問題,並認爲我會分享解決方案,任何人都可以使用它。

當使用由StereoRectify生成的旋轉矩陣R1和R2時,InitUndistortRectifyMap確實輸出空白圖像。

因此,我試圖根據OpenCV的文檔使用StereoRectifyUncalibrated,其產生2單對應性矩陣H 1和H 2,和I計算出的旋轉:

R1 = INV(CamMatrix1)* H1 * CamMatrix1 R2 = inv(CamMatrix2)* H2 * CamMatrix2

我將新的R1和R2傳遞給InitUndistortRectifyMap並重新映射,結果令人滿意。

2

我打算挖掘這篇舊帖子,因爲我最近在研究這個問題時已經做了一些努力。也就是說,我面臨同樣的問題 - 經過適當的立體聲校準和校正(所有opencv提供的立體視覺機器)後,最終「扭曲」的圖像是黑色的。讓我解釋一下爲什麼如此。

首先,如何重映射(src,dst,mapX,mapY)的作品。如果你去documentation,你可以看到,

enter image description here

而且如果值MAPX(X,Y)或mapY的一個(X,Y)爲src之外,DST(X,Y)= 0(黑色!)。這意味着,所有對(x,y)在mapX或mapY中都有無效的值。例如,就我而言,由於我無法解釋的原因,我在mapY中有所有的值。

但是,這是唯一的原因,這隻發生在特定的視覺配置。我用攝像頭對齊了幾個例子,它們之間的旋轉角度很小(高達幾度)。在這種情況下,opencv程序運行良好。當兩個歐拉角相同並且一個角度(圍繞Y的旋轉)爲17度時,我遇到了'黑色'輸出問題。在這種情況下,我做了一些實驗 - 我翻譯MapX與mapY以下列方式:

for(int i=0;i<_imageSize.width;i++) 
     for(int j=0;j<_imageSize.height;j++) { 
      _mapXA.at<float>(j, i) -= 1200; 
      _mapYA.at<float>(j, i) -= 1200; 
      _mapXB.at<float>(j, i) += 2500; 
      _mapYB.at<float>(j, i) += 2500; 
     } 

(怎麼一回事,因爲我看到_mapXA是太大和_mapYB有大約-1500負值)。令人驚訝的是,remap()之後的輸出不是黑色的。圖像看上去完全像旋轉某個角度(17可能是,我沒有檢查完全一樣),但它沒有被糾正。

opencv可能無法很好地處理立體視覺中的非平行相機。我的意思是,它適用於某些示例,有些則不適用 - 但這意味着此方法不可行。此外,你可以找到這些信息加里·布拉德斯基和阿德里安·卡勒學習OpenCV的

再次,這是一個原因,你會傾向於,如果你安排你的 相機是作爲近正面平行,以取得更好的成績可能的(至少直到你成爲專家 立體視覺)

相關問題