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

文字內容 或 影像內容 部份參考、引用自網路,如有侵權,請告知,謝謝。
創作者介紹

拾人牙慧點滴

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


留言列表 (9)

發表留言
  • 呂杰陽
  • 不好意思 可以講一下怎讀取設定黨那邊 我照著用但無法執行
  • HI,
    可以提供程式所印出來的訊息嗎?這樣比較好判斷該如何修改。
    另外是打算以讀圖檔的方式來作 Calibration ? 還是直接用 Camera 來即作處理?

    silverwind1982 於 2016/11/01 15:55 回覆

  • 呂杰陽
  • 我卡的部分是不知道如何把圖片丟進去 以圖檔的方式
    我在想是不是卡在.xml的部分 就是上面圖片檔的部分
    我不清楚怎打
  • 如果是要以讀取圖片檔方式,直接把把 input 的欄位改為:
    <Input>"./VID5.xml"</Input>
    在此範例的相同資料夾下,可以看到 VID5.xml 的檔案,再把圖片檔以絕對路徑的方式填入 images 的欄位內即可,例如:
    <images>
    /home/user/ImageSequence/test/Image0001.bmp
    /home/user/ImageSequence/test/Image0002.bmp
    /home/user/ImageSequence/test/Image0003.bmp
    /home/user/ImageSequence/test/Image0004.bmp
    /home/user/ImageSequence/test/Image0005.bmp
    /home/user/ImageSequence/test/Image0006.bmp
    /home/user/ImageSequence/test/Image0007.bmp
    </images>

    silverwind1982 於 2016/11/02 14:04 回覆

  • 呂杰陽
  • 那如果我想直接用鏡頭的話 我鏡頭ID去哪找
  • $ ls /dev/video*
    看它出現的號碼是什麼,有可能是:
    /dev/video0 或 /dev/video1

    silverwind1982 於 2016/11/02 13:56 回覆

  • 呂杰陽
  • 我的一職跳出值回-1 我用圖片了還是依樣
    那是哪裡有出問題呢
  • 程式中會 "return -1;" 的地方有兩個:
    一是缺少檔案 - default.xml,要確認是否有把 in_VID5.xml 改名或複製為 default.xml。
    另一個是 default.xml 的內容設定錯誤,會隨之出現錯誤訊息: "Invalid xxx ",需要這部分的資訊才能知道是哪個參數設定有問題。

    silverwind1982 於 2016/11/02 16:35 回覆

  • 呂杰陽
  • 我的是第一個 但我有改好 不過還是跳-1
    我的圖片是用範例的
    D:\Users\Administrator\Downloads\opencv\sources\samples\data\left01.JPG
    D:\Users\Administrator\Downloads\opencv\sources\samples\data\left02.JPG
    D:\Users\Administrator\Downloads\opencv\sources\samples\data\left03.JPG
    D:\Users\Administrator\Downloads\opencv\sources\samples\data\left04.JPG
    D:\Users\Administrator\Downloads\opencv\sources\samples\data\left05.JPG
    D:\Users\Administrator\Downloads\opencv\sources\samples\data\left06.JPG
    D:\Users\Administrator\Downloads\opencv\sources\samples\data\left07.JPG
    D:\Users\Administrator\Downloads\opencv\sources\samples\data\left08.JPG
    D:\Users\Administrator\Downloads\opencv\sources\samples\data\left09.JPG
  • 它有印出什麼樣的錯誤訊息嗎? 例如:
    Could not open the configuration file:
    或是:
    Invalid input detected. Application stopping.
    或是有印出其它的訊息?

    silverwind1982 於 2016/11/02 16:48 回覆

  • 悄悄話
  • 呂杰陽
  • ConsoleApplication2.exe' (Win32): 已載入 'D:\Users\Administrator\Documents\Visual Studio 2015\Projects\ConsoleApplication2\x64\Debug\ConsoleApplication2.exe'。已載入符號。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\ntdll.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\kernel32.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\KernelBase.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\vcruntime140d.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\msvcp140d.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\ucrtbased.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'D:\Users\Administrator\Downloads\opencv\build\x64\vc14\bin\opencv_world310d.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\user32.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\win32u.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\gdi32.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\gdi32full.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\ole32.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\combase.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\ucrtbase.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\rpcrt4.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\bcryptprimitives.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\sechost.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\oleaut32.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\msvcp_win.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\comdlg32.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\msvcrt.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\SHCore.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\shlwapi.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\shell32.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_5.82.14393.0_none_4151bdeb4bbdd21f\comctl32.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\cfgmgr32.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\advapi32.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\windows.storage.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\powrprof.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\kernel.appcore.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\profapi.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\msvfw32.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\avifil32.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\avicap32.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\concrt140d.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\msacm32.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\winmm.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\winmmbase.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\winmmbase.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\winmmbase.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\winmmbase.dll'。找不到或無法開啟 PDB 檔案。
    ConsoleApplication2.exe' (Win32): 已卸載 'C:\Windows\System32\winmmbase.dll'
    ConsoleApplication2.exe' (Win32): 已卸載 'C:\Windows\System32\winmmbase.dll'
    ConsoleApplication2.exe' (Win32): 已卸載 'C:\Windows\System32\winmmbase.dll'
    ConsoleApplication2.exe' (Win32): 已載入 'C:\Windows\System32\imm32.dll'。找不到或無法開啟 PDB 檔案。

    ***** VIDEOINPUT LIBRARY - 0.1995 - TFW07 *****

    0x878 執行緒以返回碼 -1 (0xffffffff) 結束。
    0x27a4 執行緒以返回碼 -1 (0xffffffff) 結束。
    0x2cc8 執行緒以返回碼 -1 (0xffffffff) 結束。
    '[8288] ConsoleApplication2.exe' 程式以返回碼 -1 (0xffffffff) 結束。
  • 感覺這種錯誤跟程式本身無關,試試看以下網頁提供的方式:
    http://mybeauty.pixnet.net/blog/post/43307374-%E8%A7%A3%E6%B1%BA%22%E6%89%BE%E4%B8%8D%E5%88%B0%E6%88%96%E7%84%A1%E6%B3%95%E9%96%8B%E5%95%9F-pdb-%E6%AA%94%E6%A1%88%22%E5%9C%A8visual-c%2B%2B-201
    或是在 google 搜尋:
    ntdll.dll 找不到或無法開啟PDB檔案

    silverwind1982 於 2016/11/02 16:54 回覆

  • john6402
  • 您好!很感謝有這樣很棒的講解!

    想請問在我們的OpenCV資料夾中

    opencv\sources\samples\cpp\tutorial_code\calib3d\camera_calibration CPP檔

    opencv\sources\samples\cpp 中 calibration CPP檔

    兩檔有甚麼分別呢?
    懇請不吝賜教!
  • 粗略的看了一下,兩者的原理差不多,不過細節不太一樣,比較好的理解方式是建議你把兩個程式都執行看看,作比較,會更清楚哪邊不同~

    silverwind1982 於 2017/03/22 11:20 回覆

找更多相關文章與討論