从 yml 文件 opencv C++ 初始化相机参数
initialize Camera parameters from yml file opencv C++
我保存了 https://github.com/opencv/opencv/blob/master/samples/cpp/stitching_detailed.cpp 中定义的 CameraParams。这是相机参数结构的样子:
struct CV_EXPORTS CameraParams
{
CameraParams();
CameraParams(const CameraParams& other);
const CameraParams& operator =(const CameraParams& other);
Mat K() const;
double focal; // Focal length
double aspect; // Aspect ratio
double ppx; // Principal point X
double ppy; // Principal point Y
Mat R; // Rotation
Mat t; // Translation
};
我使用以下脚本将此相机参数写入 yml 文件:
<cameraParams> cameras;
FileStorage fs(fileName, FileStorage::WRITE);
fs << "K" << cameras.K();
fs << "R" << cameras.R;
fs << "t" << cameras.t;
fs << "ppx" << cameras.ppx;
fs << "ppy" << cameras.ppy;
fs << "focal" << cameras.focal;
fs << "aspect" << cameras.aspect;
fs.release();
文件内容如下所示:
%YAML:1.0
---
K: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [ 2.4125938056164614e+003, 0., 447., 0.,
2.4125938056164614e+003, 3.3550000000000000e+002, 0., 0., 1. ]
R: !!opencv-matrix
rows: 3
cols: 3
dt: f
data: [ -9.67408061e-001, 7.91518241e-002, -2.40534484e-001,
-4.17553373e-002, -9.86752093e-001, -1.56770796e-001,
-2.49756604e-001, -1.41617730e-001, 9.57896829e-001 ]
t: !!opencv-matrix
rows: 3
cols: 1
dt: d
data: [ 0., 0., 0. ]
ppx: 447.
ppy: 3.3550000000000000e+002
focal: 2.4125938056164614e+003
aspect: 1.
现在我想使用这些相同的参数并将它们读回,但这不起作用(给出 运行 时间错误)。这是使用的读取函数:
Mat K, R, t;
double ppx, ppy, focal, aspect;
FileStorage fs(fileName, FileStorage::READ);
fs["K"] >> K;
fs["R"] >> R;
fs["t"] >> t;
fs["ppx"] >> ppx;
fs["ppy"] >> ppy;
fs["focal"] >> focal;
fs["aspect"] >> aspect;
camerasTest[i].K() = (Mat)K;
camerasTest[i].R = R;
camerasTest[i].t = t;
camerasTest[i].ppx = (double)ppx;
camerasTest[i].ppy = (double)ppy;
camerasTest[i].focal = (double)focal;
camerasTest[i].aspect = (double)aspect;
fs.release()
我该如何解决这个问题?
'K' 的初始化某处出错。我做了这个改变,它开始工作了。
for (int i = 0; i < num_images; ++i)
{
Mat_<float> K;
cameras[i].K().convertTo(K, CV_32F);
}
我保存了 https://github.com/opencv/opencv/blob/master/samples/cpp/stitching_detailed.cpp 中定义的 CameraParams。这是相机参数结构的样子:
struct CV_EXPORTS CameraParams
{
CameraParams();
CameraParams(const CameraParams& other);
const CameraParams& operator =(const CameraParams& other);
Mat K() const;
double focal; // Focal length
double aspect; // Aspect ratio
double ppx; // Principal point X
double ppy; // Principal point Y
Mat R; // Rotation
Mat t; // Translation
};
我使用以下脚本将此相机参数写入 yml 文件:
<cameraParams> cameras;
FileStorage fs(fileName, FileStorage::WRITE);
fs << "K" << cameras.K();
fs << "R" << cameras.R;
fs << "t" << cameras.t;
fs << "ppx" << cameras.ppx;
fs << "ppy" << cameras.ppy;
fs << "focal" << cameras.focal;
fs << "aspect" << cameras.aspect;
fs.release();
文件内容如下所示:
%YAML:1.0
---
K: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [ 2.4125938056164614e+003, 0., 447., 0.,
2.4125938056164614e+003, 3.3550000000000000e+002, 0., 0., 1. ]
R: !!opencv-matrix
rows: 3
cols: 3
dt: f
data: [ -9.67408061e-001, 7.91518241e-002, -2.40534484e-001,
-4.17553373e-002, -9.86752093e-001, -1.56770796e-001,
-2.49756604e-001, -1.41617730e-001, 9.57896829e-001 ]
t: !!opencv-matrix
rows: 3
cols: 1
dt: d
data: [ 0., 0., 0. ]
ppx: 447.
ppy: 3.3550000000000000e+002
focal: 2.4125938056164614e+003
aspect: 1.
现在我想使用这些相同的参数并将它们读回,但这不起作用(给出 运行 时间错误)。这是使用的读取函数:
Mat K, R, t;
double ppx, ppy, focal, aspect;
FileStorage fs(fileName, FileStorage::READ);
fs["K"] >> K;
fs["R"] >> R;
fs["t"] >> t;
fs["ppx"] >> ppx;
fs["ppy"] >> ppy;
fs["focal"] >> focal;
fs["aspect"] >> aspect;
camerasTest[i].K() = (Mat)K;
camerasTest[i].R = R;
camerasTest[i].t = t;
camerasTest[i].ppx = (double)ppx;
camerasTest[i].ppy = (double)ppy;
camerasTest[i].focal = (double)focal;
camerasTest[i].aspect = (double)aspect;
fs.release()
我该如何解决这个问题?
'K' 的初始化某处出错。我做了这个改变,它开始工作了。
for (int i = 0; i < num_images; ++i)
{
Mat_<float> K;
cameras[i].K().convertTo(K, CV_32F);
}