2012-10-16 37 views
6

我一直在嘗試使用OpenCV的攝像機校準套件從魚眼攝像頭(如果它是相關的,我使用的是GoPro)保持不變的圖像。我已經掌握了大部分流程,並且可以生成不失真的圖像。但是,使用重映射時,未失真的圖像是「有效的矩形」 - 換句話說,返回的圖像是原始的裁剪版本,以避免未失真幀中固有的曲面黑色邊框。使用OpenCV進行單攝像機校準 - 生成「完整」未失真圖像的問題

我試圖用getOptimalNewCameraMatrix()來糾正這種情況,結果很奇怪。我希望你們中的一位能夠解決我的問題。

我目前校準相機如下:

double error = calibrateCamera(worldPoints, sensorPoints, process_size, cameraMatrix, distCoeffs, rvecs, tvecs, calibration_flags); 

生成我需要的cameraMatrix。這部分工作(我認爲),因爲如果我通過initUndistortRectifyMap(),然後是remap()運行它,我會得到一個有效的圖像。不過,我正在尋找完整的圖像,所以我做的下一件事就是試圖糾正我的cameraMatrix如下:

int alpha = 1; 
cameraMatrix_corr = getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, image.size(), alpha); 

於是,我產生重映射X和Y地圖,如下(這是直接從OpenCV 2.0 Cookbook借用,所以我相信它也可以工作)。

initUndistortRectifyMap(
    cameraMatrix_corr, // computed camera matrix 
    distCoeffs, // computed distortion matrix 
    Mat(), // optional rectification (none) 
    Mat(), // camera matrix to generate undistorted 
    image.size(), // size of undistorted 
    CV_32FC1,  // type of output map 
    map1, map2); // the x and y mapping functions 

最後,我重新映射了我的圖像!

// Apply mapping functions 
remap(image, undistorted, map1, map2, INTER_LINEAR); 

這是我目前的結果。如果我使用alpha = 0(不改變矩陣),我會得到合理的(雖然是裁剪)結果。

Image (alpha = 1)

如果我使用的α= 1,我覺得應該給我一個圖像映射到新的圖像的每個原始像素,我得到如下:

Image(alpha = 0)

所以,我的問題是這樣的:我做錯了什麼,爲什麼我不能從校準中獲得未剪切的,沒有失真的圖像?

非常感謝你的支持,這是我的第一個問題,但我儘量做到儘可能完整。讓我知道如果我搞砸了!

回答

4

我認爲糾正相機矩陣不是你應該做的不扭曲的事情,因爲這會給你一個相機矩陣,好像沒有失真。

如果您不想「丟失」圖像信息,最好將x和y的地圖移動並將圖像映射到更大的圖像。這是因爲當不扭曲角落中的像素將向外移動以修正圖像時。

請記住魚眼鏡頭有很高的失真,甚至在使用正確的代碼時甚至可能無法完全糾正。

+1

我有一個類似的問題,其中由優化函數給出的感興趣區域太小。基於你的「糾正相機矩陣不是你應該做的不扭曲的建議」,我嘗試在'dst = cv2.undistort(img,camera_matrix,dist_coefs,None,newcameramtx)'中刪除'newcameramtx'參數,問題給我。謝謝! –