我一直在嘗試使用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(不改變矩陣),我會得到合理的(雖然是裁剪)結果。
如果我使用的α= 1,我覺得應該給我一個圖像映射到新的圖像的每個原始像素,我得到如下:
所以,我的問題是這樣的:我做錯了什麼,爲什麼我不能從校準中獲得未剪切的,沒有失真的圖像?
非常感謝你的支持,這是我的第一個問題,但我儘量做到儘可能完整。讓我知道如果我搞砸了!
我有一個類似的問題,其中由優化函數給出的感興趣區域太小。基於你的「糾正相機矩陣不是你應該做的不扭曲的建議」,我嘗試在'dst = cv2.undistort(img,camera_matrix,dist_coefs,None,newcameramtx)'中刪除'newcameramtx'參數,問題給我。謝謝! –