2013-03-04 168 views
0

我首先使用opencv包(stereo_calib.cpp)中的示例代碼校準了我的相機。現在我想用它來糾正圖像的立體匹配。我開始糾正一個圖像,但我不能僅僅因爲initUndistortRectifyMap返回一個不包含任何內容的地圖而工作。我找不到我做錯了什麼。initUndistortRectifyMap返回空映射矩陣(C++)

Mat ciml, cimr, iml, imr, imlCalibrated, imrCalibrated; 
vector<KeyPoint> keyl, keyr, keyInPlane, keyMatched; 

//-- Load Images and convert to gray scale 
string filenamel = "img/imL2.png"; 
string filenamer = "img/imR2.png"; 

ciml = imread(filenamel, 0); 
cvtColor(iml, ciml, CV_GRAY2BGR); 
cimr = imread(filenamer, 0); 
cvtColor(imr, cimr, CV_GRAY2BGR); 
Size imageSize = iml.size(); 

//-- Load calibration matrices 
FileStorage fs_in, fs_ex; 
fs_in.open("intrinsics.yml", FileStorage::READ); 
fs_ex.open("extrinsics.yml", FileStorage::READ); 
Mat rmap[2][2], cameraMatL, cameraMatR, coeffMatL, coeffMatR, R1, R2, P1, P2; 
fs_ex["R1"] >> R1; fs_ex["R2"] >> R2; 
fs_ex["P1"] >> P1; fs_ex["P2"] >> P2; 
fs_in["M1"] >> cameraMatL; fs_in["M2"] >> cameraMatR; 
fs_in["D1"] >> coeffMatL; fs_in["D2"] >> coeffMatR; 
cout << "camera Matrix: " << endl << cameraMatL << endl << endl; 

//-- Find remap values 
initUndistortRectifyMap(cameraMatL, coeffMatL, R1, P1, imageSize, CV_16SC2, rmap[0][0], rmap[0][1]); 
initUndistortRectifyMap(cameraMatR, coeffMatR, R2, P2, imageSize, CV_16SC2, rmap[1][0], rmap[1][1]); 

解答: 這是非常簡單的,因爲圖像沒有加載圖像大小是零,因此在地圖是一個空矩陣。 將盡快發佈答案。

+0

您是否在rmap中獲得0x0大小的圖像,或者地圖中的像素值是0?請注意,由initUndistortRectifyMap生成的映射將用作函數重映射中的參數。這會做你想看到的實際失真。如果使用CV_16SC2格式,我不確定您必須使用第二個rmap參數。 – 2013-03-04 12:11:50

+0

我得到了0x0大小的圖像。因爲圖像沒有加載。謝謝您的幫助。對不起,我問過這樣一個簡單的問題,我只是一直在尋找答案。 – TobyHijzen 2013-03-04 12:21:40

回答

0

這是非常簡單的,因爲圖像沒有加載的圖像大小爲零,所以地圖是空的。