8 #include "PinholeCameraTrajectoryIO.h"
11 #include <IJsonConvertibleIO.h>
14 #include <Eigen/Dense>
15 #include <Eigen/Geometry>
16 #include <unordered_map>
33 static const std::unordered_map<
35 std::function<bool(
const std::string &,
43 static const std::unordered_map<
45 std::function<bool(
const std::string &,
54 std::shared_ptr<camera::PinholeCameraTrajectory>
56 auto trajectory = std::make_shared<camera::PinholeCameraTrajectory>();
63 std::string filename_ext =
65 if (filename_ext.empty()) {
67 "Read camera::PinholeCameraTrajectory failed: unknown file "
75 "Read camera::PinholeCameraTrajectory failed: unknown file "
79 return map_itr->second(
filename, trajectory);
85 std::string filename_ext =
87 if (filename_ext.empty()) {
89 "Write camera::PinholeCameraTrajectory failed: unknown file "
97 "Write camera::PinholeCameraTrajectory failed: unknown file "
101 return map_itr->second(
filename, trajectory);
123 double ts,
x,
y,
z, qx, qy, qz, qw;
124 Eigen::Matrix4d transform;
126 if (strlen(line_buffer) > 0 && line_buffer[0] !=
'#') {
127 if (sscanf(line_buffer,
"%lf %lf %lf %lf %lf %lf %lf %lf", &ts, &
x,
128 &
y, &
z, &qx, &qy, &qz, &qw) != 8) {
134 transform.setIdentity();
135 transform.topLeftCorner<3, 3>() =
136 Eigen::Quaterniond(qw, qx, qy, qz).toRotationMatrix();
137 transform.topRightCorner<3, 1>() = Eigen::Vector3d(
x,
y,
z);
139 param.intrinsic_ = intrinsic;
140 param.extrinsic_ = transform.inverse();
158 Eigen::Quaterniond q;
159 fprintf(f,
"# TUM trajectory, format: <t> <x> <y> <z> <qx> <qy> <qz> <qw>");
160 for (
size_t i = 0; i < trajectory.
parameters_.size(); i++) {
161 const Eigen::Matrix4d transform =
163 q = transform.topLeftCorner<3, 3>();
164 fprintf(f,
"%zu %lf %lf %lf %lf %lf %lf %lf\n", i, transform(0, 3),
165 transform(1, 3), transform(2, 3), q.x(), q.y(), q.z(), q.w());
192 Eigen::Matrix4d trans;
194 if (strlen(line_buffer) > 0 && line_buffer[0] !=
'#') {
195 if (sscanf(line_buffer,
"%d %d %d", &i, &j, &k) != 3) {
205 res = sscanf(line_buffer,
"%lf %lf %lf %lf", &trans(0, 0),
206 &trans(0, 1), &trans(0, 2), &trans(0, 3));
213 res = sscanf(line_buffer,
"%lf %lf %lf %lf", &trans(1, 0),
214 &trans(1, 1), &trans(1, 2), &trans(1, 3));
221 res = sscanf(line_buffer,
"%lf %lf %lf %lf", &trans(2, 0),
222 &trans(2, 1), &trans(2, 2), &trans(2, 3));
229 res = sscanf(line_buffer,
"%lf %lf %lf %lf", &trans(3, 0),
230 &trans(3, 1), &trans(3, 2), &trans(3, 3));
233 param.intrinsic_ = intrinsic;
234 param.extrinsic_ = trans.inverse();
251 for (
size_t i = 0; i < trajectory.
parameters_.size(); i++) {
254 fprintf(f,
"%d %d %d\n", (
int)i, (
int)i, (
int)i + 1);
255 fprintf(f,
"%.8f %.8f %.8f %.8f\n", trans(0, 0), trans(0, 1),
256 trans(0, 2), trans(0, 3));
257 fprintf(f,
"%.8f %.8f %.8f %.8f\n", trans(1, 0), trans(1, 1),
258 trans(1, 2), trans(1, 3));
259 fprintf(f,
"%.8f %.8f %.8f %.8f\n", trans(2, 0), trans(2, 1),
260 trans(2, 2), trans(2, 3));
261 fprintf(f,
"%.8f %.8f %.8f %.8f\n", trans(3, 0), trans(3, 1),
262 trans(3, 2), trans(3, 3));
Contains the pinhole camera intrinsic parameters.
Contains both intrinsic and extrinsic pinhole camera parameters.
std::vector< PinholeCameraParameters > parameters_
List of PinholeCameraParameters objects.
#define DEFAULT_IO_BUFFER_SIZE
Eigen::Matrix< double, 4, 4, Eigen::DontAlign > Matrix4d_u
@ PrimeSenseDefault
Default settings for PrimeSense camera sensor.
bool ReadPinholeCameraTrajectoryFromLOG(const std::string &filename, camera::PinholeCameraTrajectory &trajectory)
bool WritePinholeCameraTrajectoryToTUM(const std::string &filename, const camera::PinholeCameraTrajectory &trajectory)
bool ReadPinholeCameraTrajectoryFromJSON(const std::string &filename, camera::PinholeCameraTrajectory &trajectory)
bool ReadPinholeCameraTrajectory(const std::string &filename, camera::PinholeCameraTrajectory &trajectory)
bool ReadPinholeCameraTrajectoryFromTUM(const std::string &filename, camera::PinholeCameraTrajectory &trajectory)
bool WritePinholeCameraTrajectory(const std::string &filename, const camera::PinholeCameraTrajectory &trajectory)
bool WritePinholeCameraTrajectoryToLOG(const std::string &filename, const camera::PinholeCameraTrajectory &trajectory)
static const std::unordered_map< std::string, std::function< bool(const std::string &, const camera::PinholeCameraTrajectory &)> > file_extension_to_trajectory_write_function
bool WriteIJsonConvertibleToJSON(const std::string &filename, const cloudViewer::utility::IJsonConvertible &object)
bool WritePinholeCameraTrajectoryToJSON(const std::string &filename, const camera::PinholeCameraTrajectory &trajectory)
std::shared_ptr< camera::PinholeCameraTrajectory > CreatePinholeCameraTrajectoryFromFile(const std::string &filename)
static const std::unordered_map< std::string, std::function< bool(const std::string &, camera::PinholeCameraTrajectory &)> > file_extension_to_trajectory_read_function
bool ReadIJsonConvertible(const std::string &filename, cloudViewer::utility::IJsonConvertible &object)
std::string GetFileExtensionInLowerCase(const std::string &filename)
FILE * FOpen(const std::string &filename, const std::string &mode)
Generic file read and write utility for python interface.