|
@@ -3,10 +3,11 @@
|
|
|
//
|
|
|
|
|
|
#include "pnp.h"
|
|
|
+#include <chrono>
|
|
|
|
|
|
-Point2d pixel2cam ( const Point2d& p, const Mat& K )
|
|
|
+cv::Point2d pixel2cam ( const cv::Point2d& p, const cv::Mat& K )
|
|
|
{
|
|
|
- return Point2d
|
|
|
+ return cv::Point2d
|
|
|
(
|
|
|
( p.x - K.at<double> ( 0,2 ) ) / K.at<double> ( 0,0 ),
|
|
|
( p.y - K.at<double> ( 1,2 ) ) / K.at<double> ( 1,1 )
|
|
@@ -22,40 +23,40 @@ P3d2d::~P3d2d()
|
|
|
|
|
|
}
|
|
|
|
|
|
-void P3d2d::Calibrate(std::vector<cv::Point3f> pts_3d,std::vector<cv::Point2f> pts_2d)
|
|
|
+void P3d2d::Calibrate(std::vector<cv::Point3d> pts_3d,std::vector<cv::Point2d> pts_2d)
|
|
|
{
|
|
|
- Mat r;
|
|
|
- solvePnP ( pts_3d, pts_2d, K_, Mat(), r, t_, false ); // 调用OpenCV 的 PnP 求解,可选择EPNP,DLS等方法
|
|
|
+ cv::Mat r;
|
|
|
+ solvePnP ( pts_3d, pts_2d, K_, cv::Mat(), r, t_, false ); // 调用OpenCV 的 PnP 求解,可选择EPNP,DLS等方法
|
|
|
cv::Rodrigues ( r, R_ ); // r为旋转向量形式,用Rodrigues公式转换为矩阵
|
|
|
}
|
|
|
|
|
|
-std::vector<cv::Point3f> P3d2d::excute(std::vector<cv::Point2f> pts_2d)
|
|
|
+std::vector<cv::Point3d> P3d2d::execute(std::vector<cv::Point2d> pts_2d)
|
|
|
{
|
|
|
|
|
|
- Mat RINV=R.inv();
|
|
|
+ cv::Mat TR=cv::Mat::zeros(3,3,R_.type());
|
|
|
|
|
|
- for(int i=0;i<pts_3d.size();++i)
|
|
|
- {
|
|
|
- Point2d p1 = pixel2cam ( pts_2d[i], K );
|
|
|
-
|
|
|
- //先求该点在相机中的d值,依据条件,该点世界坐标y=0
|
|
|
- //旋转矩阵 R*([x,0,z]+t_)=(p1.x*d, p1.y*d, d)
|
|
|
-
|
|
|
- Point3f pose3d ( Point3f ( p1.x*distance, p1.y*distance, distance ) );
|
|
|
+ std::vector<cv::Point3d> world_points;
|
|
|
|
|
|
|
|
|
+ for(int i=0;i<pts_2d.size();i++)
|
|
|
+ {
|
|
|
+ cv::Point2d pt = pixel2cam(pts_2d[i], K_);
|
|
|
+ double a = pt.x;
|
|
|
+ double b = pt.y;
|
|
|
|
|
|
- Mat pose3d_m=Mat::zeros(3,1,R.type());
|
|
|
+ TR.at<double>(0, 0) = a * R_.at<double>(0, 0) + b * R_.at<double>(0, 1) + R_.at<double>(0, 2);
|
|
|
+ TR.at<double>(0, 1) = -1;
|
|
|
|
|
|
- pose3d_m.at<double>(0,0)=pose3d.x-t.at<double>(0,0);
|
|
|
- pose3d_m.at<double>(1,0)=pose3d.y-t.at<double>(1,0);
|
|
|
- pose3d_m.at<double>(2,0)=pose3d.z-t.at<double>(2,0);
|
|
|
+ TR.at<double>(1, 0) = a * R_.at<double>(1, 0) + b * R_.at<double>(1, 1) + R_.at<double>(1, 2);
|
|
|
+ TR.at<double>(2, 0) = a * R_.at<double>(2, 0) + b * R_.at<double>(2, 1) + R_.at<double>(2, 2);
|
|
|
+ TR.at<double>(2, 2) = -1;
|
|
|
|
|
|
- Mat o_pose=RINV*pose3d_m;
|
|
|
+ cv::Mat T = -t_;
|
|
|
+ cv::Mat dxz = TR.inv() * T;
|
|
|
|
|
|
- printf(" cal :%f, %f, %f org:%f, %f, %f\n",o_pose.at<double>(0,0),o_pose.at<double>(1,0),o_pose.at<double>(2,0),
|
|
|
- pts_3d[i].x,pts_3d[i].y,pts_3d[i].z);
|
|
|
+ world_points.push_back(cv::Point3d(dxz.at<double>(1,0),0,dxz.at<double>(2,0)));
|
|
|
|
|
|
}
|
|
|
+ return world_points;
|
|
|
|
|
|
}
|