camera_calibration 為 OpenCV 所提供的範例程式,目地為對 相機(Camera) 作 校正(Calibration),以減少因為相機本身的因素而導致所拍攝的影像失真過大,而影響後續的影像處理。
該程式最後會產出該相機的相機矩陣(Camera Matrix,也就是內部參數 - Intrinsic Parameters) 以及 失真系數(Distortion Coefficients),可供後續作影像處理時參考使用。

程式路徑:
opencv-3.1.0/samples/cpp/tutorial_code/calib3d/camera_calibration

共有四個檔案,檔名如下:
camera_calibration.cpp
in_VID5.xml
out_camera_data.yml
VID5.xml




程式流程

程式內容主要在 camera_calibration.cpp 中:

  1. 一開始先讀取設定檔 - default.xml:
    把 in_VID5.xml 的資訊複製過來即可,可以設定的參數有:棋盤的大小、棋盤格的大小、Calibration Pattern、讀取影像的方法、需要多少個影像來作校正、結果輸出檔案名稱…等。

    一般來說,棋盤的規格就按設定檔的規格來列印,比較需要修改的地方是 input 的參數,它可以用來選擇要讀取的影像的來源,如果是要從 Camera 直接讀取,可以把 input 設定 Camera 的 ID,如果 Camera 的 ID 為 1,則設定為:
    <Input>1</Input>

    如果影像的來源為 video,則將 input 設定為 video 的路徑,如果路徑為 "/tmp/x.avi",則設定為:
    <Input>"/tmp/x.avi"</Input>

    如果影像的來源為圖片檔,則先把所要讀取的圖片檔案路徑寫入 xxx.xml 中,再將 input 設定為該 xxx.xml 的路徑,如果路徑為 "./VID5.xml",則設定為:
    <Input>"./VID5.xml"</Input>
    ./VID5.xml 則為一連串的圖片路徑名稱,如:
    <images>
    images/CameraCalibraation/VID5/xx1.jpg
    images/CameraCalibraation/VID5/xx2.jpg
    images/CameraCalibraation/VID5/xx3.jpg
    images/CameraCalibraation/VID5/xx4.jpg
    images/CameraCalibraation/VID5/xx5.jpg
    images/CameraCalibraation/VID5/xx6.jpg
    images/CameraCalibraation/VID5/xx7.jpg
    images/CameraCalibraation/VID5/xx8.jpg
    </images>


  2. 在影像中搜尋指定的 Calibration Pattern:
    如果有找到,則在影像中標示出該 Pattern 的 Corner,待集滿所需要的影像數目後,即可利用這些 Calibration Pattern 在影像中的位置,開始作校正。
    下圖為已搜尋到並標示 Calibration Patter (Chessboard) 的影像,可以明顯注意到影像邊緣有 barrel distortion 的情況產生:
    cc_01

  3. 利用所偵測到的 Calibration Pattern 的位置以及實際上 Calibration Pattern 的位置作影像校正:

    這個步驟是由 OpenCV 所提供的函式來實作:
    calibrateCamera(InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints, Size imageSize, InputOutputArray cameraMatrix, InputOutputArray distCoeffs, ...)
    - Finds the camera intrinsic and extrinsic parameters from several views of a calibration pattern.

    主要的三個參數有:objectPoints、imagePoints、imageSize。
    分別代表: Calibration Pattern 在現實中的位置,所偵測到的 Calibration Pattern 在影像中的位置,以及影像的大小。
    因為現實上的 Calibration Pattern 會是直線,不會有彎曲的情況,但在影像中所偵測到的 Calibration Pattern 的位置,則有可能有彎曲的情況,所以利用如果將影像中的彎曲線調整成直線的方式,來計算失真系數;而利用 Calibration Pattern 彼此間在現實中的相對距離 與 在影像中的相對距離 相比較,則可以計算出相機矩陣。
    在計算 失真系數 時需要知道 imageSize,才能知道目前 Calibration Pattern 在整張影像中的相對關係。以 barrel distortion 的情況舉例來說,是愈靠近影像邊緣,彎曲的情況愈嚴重;在計算 相機矩陣 時,似乎不需要知道 imageSize …。

  4. 接著將所求得的相機矩陣及失真系數代入影像序列中,播放經過校正的影像,並輸出所求得的相機矩陣及失真系數。
    下圖是經校正後的影像結果,可以注意到影像邊緣的 barrel distortion 已被修正:
    cc_02




Reference
Camera calibration With OpenCV

文字內容 或 影像內容 部份參考、引用自網路,如有侵權,請告知,謝謝。
arrow
arrow
    全站熱搜

    silverwind1982 發表在 痞客邦 留言(9) 人氣()