/slam6d/trunk-external/src/pmd/calibrate/extrinsic.cc

https://github.com/AsherBond/MondocosmOS · C++ · 78 lines · 63 code · 14 blank · 1 comment · 6 complexity · 67f03f2a1023689e200c268e77b12c9d MD5 · raw file

  1. #include <cv.h>
  2. #include <highgui.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. int main(int argc, char **argv) {
  6. if(argc < 3) {
  7. printf("extrinic: x y img1 img2\n");
  8. exit(1);
  9. }
  10. // extrinic params: rotation and translation
  11. CvMat *rotCam = cvCreateMat(1, 3, CV_32FC1);
  12. CvMat *transCam = cvCreateMat(1, 3, CV_32FC1);
  13. CvMat *rotPMD = cvCreateMat(1, 3, CV_32FC1);
  14. CvMat *transPMD = cvCreateMat(1, 3, CV_32FC1);
  15. CvSize boardSz = cvSize(atoi(argv[1]), atoi(argv[2]));
  16. int totalPoints = boardSz.width*boardSz.height;
  17. double boardSide = 0.04;
  18. CvMat *objPts = cvCreateMat(totalPoints, 3, CV_32FC1);
  19. CvPoint2D32f *cornersCam = (CvPoint2D32f*)cvAlloc(totalPoints * sizeof(CvPoint2D32f));
  20. CvMat imgPtsCam = cvMat(totalPoints, 1, CV_32FC2, cornersCam);
  21. CvPoint2D32f *cornersPMD = (CvPoint2D32f*)cvAlloc(totalPoints * sizeof(CvPoint2D32f));
  22. CvMat imgPtsPMD = cvMat(totalPoints, 1, CV_32FC2, cornersPMD);
  23. for(int i = 0; i < totalPoints; i++) {
  24. CV_MAT_ELEM(*objPts, float, i, 0) = boardSide * (i / boardSz.width);
  25. CV_MAT_ELEM(*objPts, float, i, 1) = boardSide * (i % boardSz.width);
  26. CV_MAT_ELEM(*objPts, float, i, 2) = 0.0f;
  27. }
  28. IplImage *imgPMD = cvLoadImage(argv[3], CV_LOAD_IMAGE_GRAYSCALE);
  29. IplImage *imgPMDU = cvCreateImage(cvGetSize(imgPMD), 8, 1);
  30. IplImage *imgCam = cvLoadImage(argv[4], CV_LOAD_IMAGE_GRAYSCALE);
  31. IplImage *imgCamU = cvCreateImage(cvGetSize(imgCam), 8, 1);
  32. CvMat *intrinsicsCam = (CvMat*)cvLoad("../intrinsic-cam-6x4.xml");
  33. CvMat *intrinsicsPMD = (CvMat*)cvLoad("../intrinsic-pmd-6x4.xml");
  34. CvMat *distortionCam = (CvMat*)cvLoad("../distortion-cam-6x4.xml");
  35. CvMat *distortionPMD = (CvMat*)cvLoad("../distortion-pmd-6x4.xml");
  36. cvUndistort2(imgPMD, imgPMDU, intrinsicsPMD, distortionPMD);
  37. cvUndistort2(imgCam, imgCamU, intrinsicsCam, distortionCam);
  38. int cornersCountCam, cornersCountPMD;
  39. int foundPMD = cvFindChessboardCorners(imgPMDU, boardSz, cornersPMD,
  40. &cornersCountPMD, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
  41. if(foundPMD) {
  42. cvFindCornerSubPix(imgPMDU, cornersPMD, cornersCountPMD, cvSize(2, 2), cvSize(-1,-1),
  43. cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
  44. printf("foundPMD\n");
  45. }
  46. int foundCam = cvFindChessboardCorners(imgCamU, boardSz, cornersCam,
  47. &cornersCountCam, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
  48. if(foundPMD) {
  49. cvFindCornerSubPix(imgCamU, cornersCam, cornersCountCam, cvSize(11, 11), cvSize(-1,-1),
  50. cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
  51. printf("foundCam\n");
  52. }
  53. cvNamedWindow("c", 0);
  54. cvNamedWindow("p", 0);
  55. cvShowImage("c", imgCamU);
  56. cvShowImage("p", imgPMDU);
  57. cvWaitKey(0);
  58. if(foundCam) cvFindExtrinsicCameraParams2(objPts, &imgPtsCam, intrinsicsCam, distortionCam, rotCam, transCam);
  59. if(foundPMD) cvFindExtrinsicCameraParams2(objPts, &imgPtsPMD, intrinsicsPMD, distortionPMD, rotPMD, transPMD);
  60. cvSave("./rotcam.xml", rotCam);
  61. cvSave("./rotpmd.xml", rotPMD);
  62. cvSave("./transcam.xml", transCam);
  63. cvSave("./transpmd.xml", transPMD);
  64. }