經過前天的內容,當我們只有一個相機的時候,我們必須透過攝影幾何來推測
相機的運動軌跡,也就是從基礎矩陣(Fundamental)推得本質矩陣(Essential),
這之間的過程必須要有相機的內參數矩陣,
本日的內容只有單一一個相機的校正,
如果你的情況是兩個相機所組成的深度相機系統,
可能還需要另外的校定,當然你也可以分別對左右相機校正後,
求得中間的基線組合出穩定測量系統。也許?
讓我們先回到本日的主題
讓我們先試著執行openCV的tutorial_code
你可以再sources code的以下路徑找到camera_calibrationopencv-3.4.7\samples\cpp\tutorial_code\calib3d
讓我們把整段程式碼複製到新的專案camera_calibration.cpp
同時複製in_VID5 跟 VID 兩個XML的文件檔
並從opencv-3.4.7\samples\data
找到left01~left14的影像當作實驗用影像。
(當然你或許也注意到了有Right01~14是用來做深度相機的校正,不過這一塊我還在研究)
做好這些事情之後我們先試著編譯程式,
這邊我遇到的一個問題是,
錯誤 C4996 'localtime': This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. Project1 C:\testopenCVcailabration\Project1\Project1\Source.cpp 577
程式碼可能用到了一些安全性問題的方式而windows不允許這種寫法,
localtime的用途似乎是再輸出相機參數的時候會有一個時間標籤,告訴你是甚麼時候校正的。
參考網路上的做法是需要去前置處理器的地方加上一些定義
_CRT_SECURE_NO_WARNINGS
做好這部分之後你可能遇到的第一個問題是,你的程式有找到in_VID5.xml這個設定檔嗎?
你可以透過再偵錯的地方加上命令引數,或是利用openCV的
cv::CommandLineParser這個類別來控制程式的命令,
能夠讀到設定檔之後,
<!-- The input to use for calibration.
To use an input camera -> give the ID of the camera, like "1"
To use an input video -> give the path of the input video, like "/tmp/x.avi"
To use an image list -> give the path to the XML or YAML file containing the list of the images, like "/tmp/circles_list.xml"
-->
<!--<inputType>IMAGE_LIST</inputType>-->
<Input>"images/CameraCalibration/VID5/VID5.xml"</Input>
確認一下你的Input裡面有沒有一個相對路徑的影像資料夾,這個資料夾放了我們上面的VID5.xml
和left01~left14的影像,
這邊的相對路徑我想是因為你的影像來源有很多種,有些是為了校正用有些則是為了測試程式功能,
所以在images底下多了一個CameraCalibration,再來則是你可能不會只校正一台相機,
所以又多了一個資料夾放不同相機的校正影像。
當然你也可以根據你的用途,有你適合的路徑也無所謂。
接著程式會先去in_VID5.xml抓你的設定,這邊的input是說 你要校正的方式是透過一系列的影像,
所以它又會根據你的路徑去找這個資料夾內有沒有VID5.xml,裡面放了一系列的影像檔名。
如果你沒有拍攝校正板影像也可以透過不同方式做校正,這邊還提供了直接抓取影片或著是讀取連結到電腦的相機的ID,但這部分暫時先不管它,有興趣的朋友歡迎自行深入。
而VID5.xml內的內容則是一系列的影像檔名,
<?xml version="1.0"?>
<opencv_storage>
<images>
images/CameraCalibration/VID5/left01.jpg
images/CameraCalibration/VID5/left02.jpg
images/CameraCalibration/VID5/left03.jpg
images/CameraCalibration/VID5/left04.jpg
images/CameraCalibration/VID5/left05.jpg
images/CameraCalibration/VID5/left06.jpg
images/CameraCalibration/VID5/left07.jpg
images/CameraCalibration/VID5/left08.jpg
images/CameraCalibration/VID5/left09.jpg
images/CameraCalibration/VID5/left10.jpg
images/CameraCalibration/VID5/left11.jpg
images/CameraCalibration/VID5/left12.jpg
images/CameraCalibration/VID5/left13.jpg
images/CameraCalibration/VID5/left14.jpg
</images>
</opencv_storage>
做好了這些設定之後,你的程式應該能夠順利執行,並顯示出校正後的影像,以及相機的校正參數。
程式的使用說明你可以參考以下內容,或是之後我會整理一些使用心得
Camera calibration With OpenCV