sample_calib_all.cpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. //
  2. // Created by zx on 22-11-9.
  3. //
  4. #include <iostream>
  5. #include "ParametersSolver.h"
  6. #include "ceres/ceres.h"
  7. std::vector<cv::Point2d> generate_2dby3d(std::vector<cv::Point3d> wpts,double* value)
  8. {
  9. double R=value[0];
  10. double P=value[1];
  11. double Y=value[2];
  12. double tx=value[3];
  13. double ty=value[4];
  14. double tz=value[5];
  15. double fx=value[6];
  16. double fy=value[7];
  17. double cx=value[8];
  18. double cy=value[9];
  19. double k1=value[10];
  20. double k2=value[11];
  21. double p1=value[12];
  22. double p2=value[13];
  23. double k3=value[14];
  24. std::vector<cv::Point2d> rets;
  25. Eigen::AngleAxis<double> rollAngle(Eigen::AngleAxisd(R,Eigen::Matrix<double,3,1>::UnitX()));
  26. Eigen::AngleAxis<double> pitchAngle(Eigen::AngleAxisd(P,Eigen::Matrix<double,3,1>::UnitY()));
  27. Eigen::AngleAxis<double> yawAngle(Eigen::AngleAxisd(Y,Eigen::Matrix<double,3,1>::UnitZ()));
  28. Eigen::Matrix<double,3,3> rotation_matrix;
  29. rotation_matrix=yawAngle*pitchAngle*rollAngle;
  30. for(int i=0;i<wpts.size();++i)
  31. {
  32. Eigen::Matrix<double,3,1> wp;
  33. wp[0]=wpts[i].x-tx;
  34. wp[1]=wpts[i].y-ty;
  35. wp[2]=wpts[i].z-tz;
  36. Eigen::Matrix<double,3,1> Rwp=rotation_matrix.inverse()*wp;
  37. double X=Rwp[0];
  38. double Y=Rwp[1];
  39. double Z=Rwp[2];
  40. double rr=X*X+Y*Y;
  41. double nx=X*(1.0+k1*rr+k2*rr*rr+k3*rr*rr*rr) + 2.0*p1*X*Y + p2*(rr+2.0*X*X);
  42. double ny=Y*(1.0+k1*rr+k2*rr*rr+k3*rr*rr*rr) + p1*(rr+2.0*Y*Y) + 2.0*p2*X*Y;
  43. cv::Point2d pt2d(nx*fx/Z+cx,ny*fy/Z+cy);
  44. rets.push_back(pt2d);
  45. }
  46. return rets;
  47. }
  48. int main()
  49. {
  50. std::vector<cv::Point2d> pt2ds;
  51. std::vector<cv::Point3d> pt3ds;
  52. ParametersSolver solver;
  53. solver.Solve(pt2ds,pt3ds);
  54. return 0;
  55. }