1919#include < pybind11/numpy.h>
2020#include < pybind11/eigen.h>
2121#include < opencv2/core/core.hpp>
22+ #include < Eigen/Core>
2223#include " spatialmp4/reader.h"
2324#include " spatialmp4/data_types.h"
2425#include " spatialmp4/utils.h"
2728
2829namespace py = pybind11;
2930
31+ namespace {
32+
33+ template <int Rows, int Cols>
34+ Eigen::Matrix<double , Rows, Cols> MatxToEigen (const cv::Matx<double , Rows, Cols> &matx) {
35+ Eigen::Matrix<double , Rows, Cols> result;
36+ for (int r = 0 ; r < Rows; ++r) {
37+ for (int c = 0 ; c < Cols; ++c) {
38+ result (r, c) = matx (r, c);
39+ }
40+ }
41+ return result;
42+ }
43+
44+ template <int Rows, int Cols>
45+ cv::Matx<double , Rows, Cols> EigenToMatx (const Eigen::Matrix<double , Rows, Cols> &matrix) {
46+ cv::Matx<double , Rows, Cols> result;
47+ for (int r = 0 ; r < Rows; ++r) {
48+ for (int c = 0 ; c < Cols; ++c) {
49+ result (r, c) = matrix (r, c);
50+ }
51+ }
52+ return result;
53+ }
54+
55+ } // namespace
56+
3057// Helper function to convert cv::Mat to numpy array
3158py::array_t <uint8_t > mat_to_numpy (const cv::Mat &mat) {
3259 if (mat.empty ()) {
@@ -81,7 +108,9 @@ PYBIND11_MODULE(spatialmp4, m) {
81108 .def_readwrite (" qx" , &SpatialML::pose_frame::qx)
82109 .def_readwrite (" qy" , &SpatialML::pose_frame::qy)
83110 .def_readwrite (" qz" , &SpatialML::pose_frame::qz)
84- .def (" as_se3" , &SpatialML::pose_frame::as_se3)
111+ .def (" as_se3" , [](const SpatialML::pose_frame &pose) {
112+ return pose.as_se3 ().matrix ();
113+ })
85114 .def (" __repr__" , [](const SpatialML::pose_frame &p) {
86115 std::ostringstream ss;
87116 ss << p;
@@ -132,7 +161,9 @@ PYBIND11_MODULE(spatialmp4, m) {
132161 .def_readwrite (" fy" , &SpatialML::camera_intrinsics::fy)
133162 .def_readwrite (" cx" , &SpatialML::camera_intrinsics::cx)
134163 .def_readwrite (" cy" , &SpatialML::camera_intrinsics::cy)
135- .def (" as_cvmat" , &SpatialML::camera_intrinsics::as_cvmat)
164+ .def (" as_cvmat" , [](const SpatialML::camera_intrinsics &intrinsics) {
165+ return MatxToEigen (intrinsics.as_cvmat ());
166+ })
136167 .def (" __repr__" , [](const SpatialML::camera_intrinsics &i) {
137168 std::ostringstream ss;
138169 ss << i;
@@ -142,9 +173,18 @@ PYBIND11_MODULE(spatialmp4, m) {
142173 // Bind camera_extrinsics struct
143174 py::class_<SpatialML::camera_extrinsics>(m, " CameraExtrinsics" )
144175 .def (py::init<>())
145- .def_readwrite (" extrinsics" , &SpatialML::camera_extrinsics::extrinsics)
146- .def (" as_cvmat" , &SpatialML::camera_extrinsics::as_cvmat)
147- .def (" as_se3" , &SpatialML::camera_extrinsics::as_se3)
176+ .def_property (
177+ " extrinsics" ,
178+ [](const SpatialML::camera_extrinsics &extrinsics) { return MatxToEigen (extrinsics.extrinsics ); },
179+ [](SpatialML::camera_extrinsics &extrinsics, const Eigen::Matrix4d &matrix) {
180+ extrinsics.extrinsics = EigenToMatx (matrix);
181+ })
182+ .def (" as_cvmat" , [](const SpatialML::camera_extrinsics &extrinsics) {
183+ return MatxToEigen (extrinsics.as_cvmat ());
184+ })
185+ .def (" as_se3" , [](const SpatialML::camera_extrinsics &extrinsics) {
186+ return extrinsics.as_se3 ().matrix ();
187+ })
148188 .def (" __repr__" , [](const SpatialML::camera_extrinsics &e) {
149189 std::ostringstream ss;
150190 ss << e;
0 commit comments