@@ -9,6 +9,7 @@ using namespace boost::python;
9
9
using namespace Eigen ;
10
10
11
11
#include < mrpt/vision/epnp.h>
12
+ #include < mrpt/vision/dls.h>
12
13
#include < mrpt/vision/pnp_algos.h>
13
14
14
15
#include < opencv2/opencv.hpp>
@@ -22,6 +23,7 @@ class PnPAlgos
22
23
~PnPAlgos ();
23
24
24
25
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);
25
27
private:
26
28
int m;
27
29
};
@@ -35,8 +37,9 @@ PnPAlgos::~PnPAlgos(){
35
37
template <typename Derived>
36
38
int pnpalgo_epnp (MatrixBase<Derived>& obj_pts, MatrixBase<Derived>& img_pts, int n, MatrixBase<Derived>& cam_intrinsic, MatrixBase<Derived>& pose_mat){
37
39
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;
40
43
41
44
// cout<<"cam_in="<<endl<<cam_in_eig<<endl<<endl;
42
45
// 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
59
62
cv2eigen (R_cv, R_eig);
60
63
cv2eigen (t_cv, t_eig);
61
64
65
+ Quaterniond q (R_eig);
66
+
67
+ pose_mat << t_eig,q.vec ();
68
+
62
69
// cout<<"R_eig="<<endl<<R_eig<<endl<<endl;
63
70
// cout<<"t_eig="<<endl<<t_eig<<endl<<endl;
64
71
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;
68
75
69
76
// cout<<"pose_mat="<<endl<<pose_mat_eig<<endl<<endl;
70
77
71
78
return 1 ;
72
79
}
73
80
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
+
74
127
int PnPAlgos::epnp_solve (PyObject* obj_pts, PyObject* img_pts, int n, PyObject* cam_intrinsic, PyObject* pose_mat){
75
128
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 );
78
131
Map<MatrixXd> _cam_intrinsic ((double *) PyArray_DATA ((PyArrayObject*)cam_intrinsic),3 ,3 );
79
132
80
133
return pnpalgo_epnp (_obj_pts, _img_pts, n, _cam_intrinsic, _pose_mat);
81
134
}
82
135
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
+
83
145
void export_pnp ()
84
146
{
85
147
class_<PnPAlgos>(" pnp" , init<int >(args (" m" )))
86
148
.def (" epnp_solve" , &PnPAlgos::epnp_solve)
149
+ .def (" dls_solve" , &PnPAlgos::dls_solve)
87
150
;
88
151
}
0 commit comments