opencv-相机标定步骤、评估标定误差以及标定之后图像坐标到世界坐标的转换_opencv特征值转换成坐标值(2)

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

下面贴出代码,开发环境opencv2.4.9+vs2013

[cpp]
view plain
copy

  1. #include “opencv2/core/core.hpp”
  2. #include “opencv2/imgproc/imgproc.hpp”
  3. #include “opencv2/calib3d/calib3d.hpp”
  4. #include “opencv2/highgui/highgui.hpp”
  5. #include 
  6. #include 
  7. using namespace std;
  8. using namespace cv;
  9. const int imageWidth = 1600;                             //摄像头的分辨率
  10. const int imageHeight = 1200;
  11. const int boardWidth = 39;                               //横向的角点数目
  12. const int boardHeight = 39;                              //纵向的角点数据
  13. const int boardCorner = boardWidth * boardHeight;       //总的角点数据
  14. const int frameNumber =7;                             //相机标定时需要采用的图像帧数
  15. const int squareSize = 10;                              //标定板黑白格子的大小 单位mm
  16. const Size boardSize = Size(boardWidth, boardHeight);   //
  17. Mat intrinsic;                                          //相机内参数
  18. Mat distortion_coeff;                                   //相机畸变参数
  19. vector rvecs;                                        //旋转向量
  20. vector tvecs;                                        //平移向量
  21. vector<vector> corners;                        //各个图像找到的角点的集合 和objRealPoint 一一对应
  22. vector<vector> objRealPoint;                   //各副图像的角点的实际物理坐标集合
  23. vector corner;                                   //某一副图像找到的角点
  24. Mat rgbImage, grayImage;
  25. /*计算标定板上模块的实际物理坐标*/
  26. void calRealPoint(vector<vector>& obj, int boardwidth, int boardheight, int imgNumber, int squaresize)
  27. {
  28. //  Mat imgpoint(boardheight, boardwidth, CV_32FC3,Scalar(0,0,0));
  29. vector imgpoint;
  30. for (int rowIndex = 0; rowIndex < boardheight; rowIndex++)
  31. {
  32. for (int colIndex = 0; colIndex < boardwidth; colIndex++)
  33. {
  34. //  imgpoint.at(rowIndex, colIndex) = Vec3f(rowIndex * squaresize, colIndex*squaresize, 0);
  35. imgpoint.push_back(Point3f(colIndex * squaresize, rowIndex * squaresize, 0));
  36. }
  37. }
  38. for (int imgIndex = 0; imgIndex < imgNumber; imgIndex++)
  39. {
  40. obj.push_back(imgpoint);
  41. }
  42. }
  43. /*设置相机的初始参数 也可以不估计*/
  44. void CalibrationEvaluate(void)//标定结束后进行评价
  45. {
  46. double err=0;
  47. double total_err=0;
  48. //calibrateCamera(objRealPoint, corners, Size(imageWidth, imageHeight), intrinsic, distortion_coeff, rvecs, tvecs, 0);
  49. cout << “每幅图像的定标误差:” << endl;
  50. for (int i = 0; i < corners.size(); i++)
  51. {
  52. vector image_points2;
  53. vector tempPointSet = objRealPoint[i];
  54. projectPoints(tempPointSet, rvecs[i], tvecs[i], intrinsic, distortion_coeff, image_points2);
  55. vector tempImagePoint = corners[i];
  56. Mat tempImagePointMat = Mat(1, tempImagePoint.size(), CV_32FC2);
  57. Mat image_points2Mat = Mat(1, image_points2.size(), CV_32FC2);
  58. for (int j = 0; j < tempImagePoint.size(); j++)
  59. {
  60. image_points2Mat.at(0, j) = Vec2f(image_points2[j].x, image_points2[j].y);
  61. tempImagePointMat.at(0, j) = Vec2f(tempImagePoint[j].x, tempImagePoint[j].y);
  62. }
  63. err = norm(image_points2Mat, tempImagePointMat, NORM_L2);
  64. total_err = err + total_err;
  65. cout << “第” << i + 1 << “幅图像的平均误差:” << err << “像素” << endl;
  66. }
  67. cout << “总体平均误差:” << total_err / (corners.size() + 1) << “像素” << endl;
  68. }
  69. void guessCameraParam(void)
  70. {
  71. /*分配内存*/
  72. intrinsic.create(3, 3, CV_64FC1);
  73. distortion_coeff.create(5, 1, CV_64FC1);
  74. /*
  75. fx 0 cx
  76. 0 fy cy
  77. 0 0  1
  78. */
  79. intrinsic.at(0, 0) = 256.8093262;   //fx
  80. intrinsic.at(0, 2) = 160.2826538;   //cx
  81. intrinsic.at(1, 1) = 254.7511139;   //fy
  82. intrinsic.at(1, 2) = 127.6264572;   //cy
  83. intrinsic.at(0, 1) = 0;
  84. intrinsic.at(1, 0) = 0;
  85. intrinsic.at(2, 0) = 0;
  86. intrinsic.at(2, 1) = 0;
  87. intrinsic.at(2, 2) = 1;
  88. /*
  89. k1 k2 p1 p2 p3
  90. */
  91. distortion_coeff.at(0, 0) = -0.193740;  //k1
  92. distortion_coeff.at(1, 0) = -0.378588;  //k2
  93. distortion_coeff.at(2, 0) = 0.028980;   //p1
  94. distortion_coeff.at(3, 0) = 0.008136;   //p2
  95. distortion_coeff.at(4, 0) = 0;          //p3
  96. }
  97. void outputCameraParam(void)
  98. {
  99. /*保存数据*/
  100. //cvSave(“cameraMatrix.xml”, &intrinsic);
  101. //cvSave(“cameraDistoration.xml”, &distortion_coeff);
  102. //cvSave(“rotatoVector.xml”, &rvecs);
  103. //cvSave(“translationVector.xml”, &tvecs);
  104. /*输出数据*/
  105. cout << “fx :” << intrinsic.at(0, 0) << endl << “fy :” << intrinsic.at(1, 1) << endl;
  106. cout << “cx :” << intrinsic.at(0, 2) << endl << “cy :” << intrinsic.at(1, 2) << endl;
  107. cout << “k1 :” << distortion_coeff.at(0, 0) << endl;
  108. cout << “k2 :” << distortion_coeff.at(1, 0) << endl;
  109. cout << “p1 :” << distortion_coeff.at(2, 0) << endl;
  110. cout << “p2 :” << distortion_coeff.at(3, 0) << endl;
  111. cout << “p3 :” << distortion_coeff.at(4, 0) << endl;
  112. }
  113. //int _tmain(int argc, _TCHAR* argv[])
  114. int main()
  115. {
  116. Mat img;
  117. int goodFrameCount = 0;
  118. namedWindow(“chessboard”);
  119. cout << “按Q退出 …” << endl;
  120. while (goodFrameCount < frameNumber)
  121. {
  122. char filename[100];
  123. sprintf_s(filename, “chao%d.bmp”, goodFrameCount);
  124. //sprintf_s(filename, “chess%d.jpg”, goodFrameCount);
  125. goodFrameCount++;
  126. rgbImage = imread(filename, 1);
  127. cvtColor(rgbImage, grayImage, CV_BGR2GRAY);
  128. imshow(“Camera”, grayImage);
  129. bool isFind = findChessboardCorners(rgbImage, boardSize, corner, 0);
  130. //bool isFind = findChessboardCorners(rgbImage, boardSize, corner, CV_CALIB_CB_NORMALIZE_IMAGE);
  131. if (isFind == true) //所有角点都被找到 说明这幅图像是可行的
  132. {
  133. /*

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

,那么很难做到真正的技术提升。**

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值