iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 15
0
自我挑戰組

我的影像視覺定位學習筆記系列 第 15

day15-Camera calibration With OpenCV相機校正

  • 分享至 

  • xImage
  •  

經過前天的內容,當我們只有一個相機的時候,我們必須透過攝影幾何來推測
相機的運動軌跡,也就是從基礎矩陣(Fundamental)推得本質矩陣(Essential),
這之間的過程必須要有相機的內參數矩陣,

本日的內容只有單一一個相機的校正,
如果你的情況是兩個相機所組成的深度相機系統,
可能還需要另外的校定,當然你也可以分別對左右相機校正後,
求得中間的基線組合出穩定測量系統。也許?

讓我們先回到本日的主題
https://ithelp.ithome.com.tw/upload/images/20191001/20121127RjiuS1iiR4.png
讓我們先試著執行openCV的tutorial_code
你可以再sources code的以下路徑找到camera_calibration
opencv-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

https://ithelp.ithome.com.tw/upload/images/20191001/20121127DRi5lg0OXM.png

做好這部分之後你可能遇到的第一個問題是,你的程式有找到in_VID5.xml這個設定檔嗎?
https://ithelp.ithome.com.tw/upload/images/20191001/20121127Cx1YmZcOEq.png
你可以透過再偵錯的地方加上命令引數,或是利用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


上一篇
day14-RANSAC在求解Fundamental的應用
下一篇
day16-Camera calibration使用心得
系列文
我的影像視覺定位學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言