2012-01-12 161 views
3

所以我對OpenCV(2.1)很新,所以請記住這一點。OpenCV cvRemap裁剪圖像

所以我設法校準我使用的廉價網絡攝像頭(使用廣角附件),使用棋盤校準方法產生內在和失真係數。

然後,我可以毫無困難地重新輸入這些值並生成圖像映射,然後將其應用於視頻輸入以更正輸入圖像。

但是我遇到了一個問題。我知道它何時扭曲/校正圖像,它會創建多個傾斜部分,然後對圖像進行格式化以剪出任何黑色區域。我的問題是,我可以查看完整的扭曲圖像,包括一些有黑色區域的區域嗎?以下是我嘗試傳達的黑色區域的示例,如果我的術語已關閉:

更好地傳達我所說的區域的圖像可以是found here!此圖像在post中被發現。

當前: cvRemap()基本上返回上面鏈接的圖像中的黃色框,但我希望看到整個圖像,因爲有相關數據我希望從中獲得。

我已經試過什麼:將縮放轉換到圖像映射到完整的圖像(包括拉伸部件)裝入框架

 CvMat *intrinsic = (CvMat*)cvLoad("Intrinsics.xml"); 
     CvMat *distortion = (CvMat*)cvLoad("Distortion.xml"); 

     cvInitUndistortMap(intrinsic, distortion, mapx, mapy); 

     cvConvertScale(mapx, mapx, 1.25, -shift_x); // Some sort of scale conversion 
     cvConvertScale(mapy, mapy, 1.25, -shift_y); // applied to the image map 

     cvRemap(distorted,undistorted,mapx,mapy); 

的cvConvertScale,當我想我已經對準了X/y正確地移動(猜測/檢查),是以某種方式扭曲圖像地圖使得校正無用。這裏可能涉及到一些數學問題,我沒有正確跟蹤/理解。

有沒有人有任何其他建議來解決這個問題,或者我可能做錯了什麼?我也嘗試寫我自己的代碼來修復失真問題,但讓我們只是說OpenCV已經知道如何做得很好。

回答

4

從內存中,您需要使用InitUndistortRectifyMap(cameraMatrix,distCoeffs,R,newCameraMatrix,map1,map2),其中InitUndistortMap是一個簡化版本。

cvInitUndistortMap(intrinsic, distort, map1, map2) 

相當於:

cvInitUndistortRectifyMap(intrinsic, distort, Identity matrix, intrinsic, 
          map1, map2) 

新參數是RnewCameraMatrixR種類進行額外的轉換(例如旋轉)以執行(僅將其設置爲單位矩陣)。

您感興趣的參數是newCameraMatrix。在InitUndistortMap中,這與原始相機矩陣相同,但您可以使用它來獲得您正在討論的縮放效果。

您將獲得帶有GetOptimalNewCameraMatrix(cameraMat, distCoeffs, imageSize, alpha,...)的新相機矩陣。您基本上輸入intrinsic,distort,您的原始圖像大小和一個參數alpha(以及用於容納結果矩陣的容器,請參閱文檔)。參數alpha將實現你想要的。

我從文檔報價:

的函數計算基於自由 縮放參數最優新的相機矩陣。通過改變這個參數,用戶可以檢索 唯一明智的像素的α= 0保留所有的原始圖像的像素,如果 有在彎道的α= 1,或得到的東西之間 有價值的信息。當α> 0時,失真結果將可能具有對應於所拍攝的失真圖像之外的「虛擬」像素的一些黑色像素。應將原始攝像機矩陣,失真 係數,計算出的新攝像機矩陣和新圖像大小 傳遞給InitUndistortRectifyMap以生成 重映射的地圖。

因此,對於極端的例子,所有的黑色位顯示你想要alpha=1

總結:

  • 呼叫cvGetOptimalNewCameraMatrixalpha=1獲得newCameraMatrix
  • 使用cvInitUndistortRectifymapR爲單位矩陣,newCameraMatrix設置爲您剛剛計算
  • 進新地圖到cvRemap之一。
+1

mathematical.coffee,我不能夠感謝你。這正是我所需要的,並且詳細的解決方案,我能夠相應地實現它!非常感謝! – user1145707 2012-01-13 14:32:57

+0

不用擔心:)它花了我永遠的工作(我發現在線文檔有時難以理解,特別是當我使用python界面時)。一個非常寶貴的資源(我發現)是OpenCV包含的例子(在'OpenCV-2.x.x/samples/pick_your_language'中)。 – 2012-01-14 00:41:54

+0

但修正圖像仍然有黑色區域或邊界。 – Abc 2017-07-04 08:31:45