简介
在参与相机标定,输入传感器外参的场景下,经常需要初始化内外参矩阵。如果将参数写入程序则每次更换参数需要重新编译,这种做法是非常不建议的。本文讨论一下各项矩阵参数的读取。
C++
opencv
下文假设我们已经获取到了K, D, R, t, T等参数。首先看看官方提供的接口,并通过接口转换为Eigen:
cpp
//存储
cv::FileStorage fs("K.yaml",cv::FileStorage::WRITE);
fs<<"Inner"<<K;
cv::FileStorage fs("R.yaml",cv::FileStorage::READ);
cv::Mat R;
fs["Rotation"] >> R;
Eigen::Matrix3d R
cv::cv2eigen(R, Rot);
还有一种通过标准库读取参数的方法,过程略显复杂:
cpp
#include <fstream>
ifstream infile("K.txt");
float a[9];
infile >> a[1] >> a[2] >> a[3] >>
a[4] >> a[5] >> a[6] >>
a[7] >> a[8] >> a[9];
cv::Mat R(3, 3, CV_16C1, a);
//或者
cv::Mat R = (cv::Mat_<float>(3,3) << a[1], a[2], a[3],
a[4], a[5], a[6],
a[7], a[8], a[9] );
Python
Python读取参数相对简单很多,基本采用numpy的接口进行矩阵的存取。
python
np.savetxt("K.txt", K, fmt="%06f")
np.savetxt("D.txt", D, fmt="%06f")
打开保存的txt文件,具体内容如下:
python
717.013878 0.000000 948.354900
0.000000 717.640231 557.712712
0.000000 0.000000 1.000000
需要注意的是,数字之间是没有分割符的。因此如果使用opencv或其他库输出的文件,带有逗号等分割符的,读取时会引起异常。读取参数文件的程序如下:
python
K = np.loadtxt("K.txt").reshape(3,3)
D = np.loadtxt("D.txt").reshape(1,-1) # 可能有4,5,8,12等不同长度的畸变参数
R = np.loadtxt("R.txt").reshape(3,3)
T = np.loadtxt("T.txt").reshape(4,4)
以上读取的变量都可以直接想opencv相关功能的函数里面塞。