一般深度相機有幾種方案
而本日的內容將說明如何使用openCV的範例stereo_calib.cpp
適用的情況在於你必須要有一個支架固定複數個相機,相機之間的角度、基線(兩個相機之間的連線)長度都會影響你校正之後的結果,如果校正完之後你的相機之間的狀態有變動,那麼你使用舊的校正參數,就可能會造成你測量出來的距離有所誤差。
如同前天的內容,你可以在sources code的以下路徑找到stereo_calib.cppopencv-3.4.7\samples\cpp
同時這個專案還需要一個stereo_calib.xml的設定檔,
你可以從上一個單目相機校正的VID5.xml複製過來做修改,
裡面的設定檔也是一連串的影像路徑。
<?xml version="1.0"?>
<opencv_storage>
<imagelist>
images/CameraCalibration/VID5/left01.jpg
images/CameraCalibration/VID5/right01.jpg
images/CameraCalibration/VID5/left02.jpg
images/CameraCalibration/VID5/right02.jpg
images/CameraCalibration/VID5/left03.jpg
images/CameraCalibration/VID5/right03.jpg
.
.
.
images/CameraCalibration/VID5/left14.jpg
images/CameraCalibration/VID5/right14.jpg
</imagelist>
</opencv_storage>
而由於我的影像相對路徑是如此我也必須同上一個專案新增一個影像的資料夾
裡面放了left01~14,right01~14兩個相機的校正物影像。
同樣的校正物影像你可以從以下路徑找到
opencv-3.4.7\samples\data
其中argv命令引數的部分,這個範例使用了cv::CommandLineParser
你可以修改input ||
裡面的設定檔檔名
cv::CommandLineParser parser(argc, argv, "{w|9|}{h|6|}{s|50.0|}{nr||}{help|1|}{@input|stereo_calib.xml|}");
if (parser.has("help"))
return print_help();
showRectified = !parser.has("nr");
imagelistfn = samples::findFile(parser.get<string>("@input"));
boardSize.width = parser.get<int>("w");
boardSize.height = parser.get<int>("h");
float squareSize = parser.get<float>("s");
執行得過程會稍微卡在這個畫面
過段時間後
他會輸出校正完的再投影誤差
並且根據計算出來的兩個相機之間的基礎矩陣代表的核線幾何
算出核線的再投影誤差
你可以決定要不要顯示改正後的影像
showRectified = !parser.has("nr");
改正完的影像
左右兩張影像的棋盤角點,應該在同一條直線上
而程式結束應該會有兩個輸出檔
intrinsics.yml
extrinsics.yml