本日嘗試把實驗影像讀入的方式改寫成校正範例
以一個xml裡面寫上影像清單
<?xml version="1.0"?>
<opencv_storage>
<imagelist>
Photos/IMAG0568.jpg
Photos/IMAG0569.jpg
</imagelist>
</opencv_storage>
將連續影像的相對位置塞成std::vector<std::string>
這個部分的改寫還算簡單
只要將單目校正的範例從中將讀影像清單的部分改寫就好
而到了要讀入相機參數的時候,就要面對XML的格式了.........
這邊暫時拿某次校準再投影比較小的設定檔做實驗,
我還沒有研究出為什麼這次校正的再投影誤差比較小的原因......
<?xml version="1.0"?>
<opencv_storage>
<calibration_time>"Sat Oct 5 22:32:33 2019"</calibration_time>
<camera_matrix type_id="opencv-matrix">
<rows>3</rows>
<cols>3</cols>
<dt>d</dt>
<data>
4.7078931752964917e+02 0. 320. 0. 4.7078931752964917e+02 240. 0. 0.
1.</data></camera_matrix>
<distortion_coefficients type_id="opencv-matrix">
<rows>5</rows>
<cols>1</cols>
<dt>d</dt>
<data>
1.2951515083696105e-01 -4.2137869135962597e-01 0. 0.
4.2134930322994174e-01</data></distortion_coefficients>
</opencv_storage>
一個XML基本上是一個fileStorage檔案的儲存模式
cv::FileStorage fs(filename, cv::FileStorage::READ);
而裡面會有很多FileNode
static bool readcamera(const std::string& filename,cv::Mat&camerMatrix,cv::Mat&disco)
{
cv::FileStorage fs(filename, cv::FileStorage::READ);
if (!fs.isOpened())
return false;
fs["camera_matrix"]>> camerMatrix;
fs["distortion_coefficients"]>> disco;
return true;
}
fs["camera_matrix"]我們直接將這個Node 指派到程式裡面的cv::Mat camerMatrix
似乎他就會自動將這個Mat 變成一個3X3的矩陣形式
而distortion_coefficients同理就會指派為一個 5X1的畸變參數形式
std::cout << cameraMatrix<< std::endl;
std::cout<< distortion_coefficients << std::endl;