Skip to content

Commit 8bfaa97

Browse files
author
mangi020
committed
Use matplotlib for comparing translation errors
1 parent c63b9ac commit 8bfaa97

File tree

1 file changed

+70
-7
lines changed

1 file changed

+70
-7
lines changed

python/src/pnp_bindings.cpp

+70-7
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ using namespace boost::python;
99
using namespace Eigen;
1010

1111
#include <mrpt/vision/epnp.h>
12+
#include <mrpt/vision/dls.h>
1213
#include <mrpt/vision/pnp_algos.h>
1314

1415
#include <opencv2/opencv.hpp>
@@ -22,6 +23,7 @@ class PnPAlgos
2223
~PnPAlgos();
2324

2425
int epnp_solve(PyObject* obj_pts, PyObject* img_pts, int n, PyObject* cam_intrinsic, PyObject* pose_mat);
26+
int dls_solve(PyObject* obj_pts, PyObject* img_pts, int n, PyObject* cam_intrinsic, PyObject* pose_mat);
2527
private:
2628
int m;
2729
};
@@ -35,8 +37,9 @@ PnPAlgos::~PnPAlgos(){
3537
template<typename Derived>
3638
int pnpalgo_epnp(MatrixBase<Derived>& obj_pts, MatrixBase<Derived>& img_pts, int n, MatrixBase<Derived>& cam_intrinsic, MatrixBase<Derived>& pose_mat){
3739

38-
MatrixXd cam_in_eig=cam_intrinsic.array().transpose(), img_pts_eig=img_pts.array().transpose(), obj_pts_eig=obj_pts.array().transpose(), R_eig, t_eig, pose_mat_eig=pose_mat;
39-
Mat cam_in_cv(3,3,CV_32F), img_pts_cv(n,2,CV_32F), obj_pts_cv(n,3,CV_32F), R_cv, t_cv;
40+
MatrixXd cam_in_eig=cam_intrinsic.array().transpose(), img_pts_eig=img_pts.array().transpose(), obj_pts_eig=obj_pts.array().transpose(), t_eig;
41+
Matrix3d R_eig;
42+
Mat cam_in_cv(3,3,CV_32F), img_pts_cv(2,n,CV_32F), obj_pts_cv(3,n,CV_32F), R_cv, t_cv;
4043

4144
//cout<<"cam_in="<<endl<<cam_in_eig<<endl<<endl;
4245
//cout<<"obj_pts="<<endl<<obj_pts_eig<<endl<<endl;
@@ -59,30 +62,90 @@ int pnpalgo_epnp(MatrixBase<Derived>& obj_pts, MatrixBase<Derived>& img_pts, int
5962
cv2eigen(R_cv, R_eig);
6063
cv2eigen(t_cv, t_eig);
6164

65+
Quaterniond q(R_eig);
66+
67+
pose_mat << t_eig,q.vec();
68+
6269
//cout<<"R_eig="<<endl<<R_eig<<endl<<endl;
6370
//cout<<"t_eig="<<endl<<t_eig<<endl<<endl;
6471

65-
pose_mat.block(0,0,3,3)=R_eig;
66-
pose_mat.block(0,3,3,1)=t_eig;
67-
pose_mat.row(3)<<0,0,0,1;
72+
//pose_mat.block(0,0,3,3)=R_eig;
73+
//pose_mat.block(0,3,3,1)=t_eig;
74+
//pose_mat.row(3)<<0,0,0,1;
6875

6976
//cout<<"pose_mat="<<endl<<pose_mat_eig<<endl<<endl;
7077

7178
return 1;
7279
}
7380

81+
template<typename Derived>
82+
int pnpalgo_dls(MatrixBase<Derived>& obj_pts, MatrixBase<Derived>& img_pts, int n, MatrixBase<Derived>& cam_intrinsic, MatrixBase<Derived>& pose_mat){
83+
84+
MatrixXd cam_in_eig=cam_intrinsic.array().transpose(), img_pts_eig=img_pts.array().transpose(), obj_pts_eig=obj_pts.array().transpose(), t_eig;
85+
Matrix3d R_eig;
86+
Mat cam_in_cv(3,3,CV_32F), img_pts_cv(n,2,CV_32F), obj_pts_cv(n,3,CV_32F), R_cv, t_cv;
87+
88+
//cout<<"cam_in="<<endl<<cam_in_eig<<endl<<endl;
89+
//cout<<"obj_pts="<<endl<<obj_pts_eig<<endl<<endl;
90+
//cout<<"img_pts="<<endl<<img_pts_eig<<endl<<endl;
91+
92+
eigen2cv(cam_in_eig, cam_in_cv);
93+
eigen2cv(img_pts_eig, img_pts_cv);
94+
eigen2cv(obj_pts_eig, obj_pts_cv);
95+
96+
//cout<<cam_in_cv<<endl;
97+
//cout<<img_pts_cv<<endl;
98+
//cout<<obj_pts_cv<<endl;
99+
100+
dls d(obj_pts_cv, img_pts_cv);
101+
d.compute_pose(R_cv,t_cv);
102+
103+
//cout<<R_cv<<endl;
104+
//cout<<t_cv<<endl;
105+
106+
cv2eigen(R_cv, R_eig);
107+
cv2eigen(t_cv, t_eig);
108+
109+
//cout<<"R_eig="<<endl<<R_eig<<endl<<endl;
110+
//cout<<"t_eig="<<endl<<t_eig<<endl<<endl;
111+
112+
Quaterniond q(R_eig);
113+
114+
pose_mat << t_eig,q.vec();
115+
116+
//pose_mat.block(0,0,3,3)=R_eig;
117+
//pose_mat.block(0,3,3,1)=t_eig;
118+
//pose_mat.row(3)<<0,0,0,1;
119+
//cout<<"t_eig="<<endl<<t_eig<<endl<<endl;
120+
//cout<<"q_eig="<<endl<<q.vec()<<endl<<endl;
121+
//cout<<"pose_eig="<<endl<<pose_mat<<endl<<endl;
122+
//cout<<"pose_cv="<<endl<<R_cv<<endl<<endl;
123+
124+
return 1;
125+
}
126+
74127
int PnPAlgos::epnp_solve(PyObject* obj_pts, PyObject* img_pts, int n, PyObject* cam_intrinsic, PyObject* pose_mat){
75128
Map<MatrixXd> _obj_pts((double *) PyArray_DATA((PyArrayObject*)obj_pts),3,n);
76-
Map<MatrixXd> _img_pts((double *) PyArray_DATA((PyArrayObject*)img_pts),n, 2);
77-
Map<MatrixXd> _pose_mat((double *) PyArray_DATA((PyArrayObject*)pose_mat),4,4);
129+
Map<MatrixXd> _img_pts((double *) PyArray_DATA((PyArrayObject*)img_pts),2,n);
130+
Map<MatrixXd> _pose_mat((double *) PyArray_DATA((PyArrayObject*)pose_mat),6,1);
78131
Map<MatrixXd> _cam_intrinsic((double *) PyArray_DATA((PyArrayObject*)cam_intrinsic),3,3);
79132

80133
return pnpalgo_epnp(_obj_pts, _img_pts, n, _cam_intrinsic, _pose_mat);
81134
}
82135

136+
int PnPAlgos::dls_solve(PyObject* obj_pts, PyObject* img_pts, int n, PyObject* cam_intrinsic, PyObject* pose_mat){
137+
Map<MatrixXd> _obj_pts((double *) PyArray_DATA((PyArrayObject*)obj_pts),3,n);
138+
Map<MatrixXd> _img_pts((double *) PyArray_DATA((PyArrayObject*)img_pts),2,n);
139+
Map<MatrixXd> _pose_mat((double *) PyArray_DATA((PyArrayObject*)pose_mat),6,1);
140+
Map<MatrixXd> _cam_intrinsic((double *) PyArray_DATA((PyArrayObject*)cam_intrinsic),3,3);
141+
142+
return pnpalgo_dls(_obj_pts, _img_pts, n, _cam_intrinsic, _pose_mat);
143+
}
144+
83145
void export_pnp()
84146
{
85147
class_<PnPAlgos>("pnp", init<int>(args("m")))
86148
.def("epnp_solve", &PnPAlgos::epnp_solve)
149+
.def("dls_solve", &PnPAlgos::dls_solve)
87150
;
88151
}

0 commit comments

Comments
 (0)