使用matlab完成照相机的标定

Computer Vision Toolbox™提供应用程序和功能,以执行相机校准工作流程中的所有基本任务  ,包括:

  • 全自动检测和定位棋盘校准图案,包括具有亚像素精度(相邻两像素之间细分情况)的角点检测
  • 估计所有内在和外在参数,包括轴偏斜
  • 径向和切向透镜畸变系数的计算
  • 校正光学畸变
  • 支持校准标准,鱼眼镜头和立体视觉相机

官方介绍:

https://ww2.mathworks.cn/help/vision/ug/camera-calibration.html

https://ww2.mathworks.cn/videos/camera-calibration-with-matlab-81233.html

译文参考教程:https://blog.csdn.net/jkhere/article/details/8784865(但这个还有手工操作,是在旧版本上的matlab)

操作参考教程:https://blog.csdn.net/heroacool/article/details/51023921

读取图像: 点击标定工具窗口中的“add Images”按钮。选取多个标定图像,都将加载进来,填写棋盘格每个格子边长的真实值,图像上的棋盘点将被自动检测出来,然后开始标定,点击Calibrate。

外部参数(网格对于摄像机的相对坐标,即摄像机坐标系)将显示出来:

在这幅图上,坐标系是摄像机坐标系。蓝色的xc,yc,zc对应着摄像头的视角

在这幅图上,坐标系是世界坐标系。每张图片拍摄相机的位置和方向都被表示出来

导出相机参数,关掉工具箱窗口就可以看到了

s

cameraParams = 

  cameraParameters - 属性:

   Camera Intrinsics
                    IntrinsicMatrix: [3×3 double]
                        FocalLength: [657.5484 658.0735]
                     PrincipalPoint: [303.5149 244.9321]
                               Skew: 0
                   RadialDistortion: [-0.2526 0.1200]
               TangentialDistortion: [0 0]
                          ImageSize: [480 640]

   Camera Extrinsics
                   RotationMatrices: [3×3×19 double]
                 TranslationVectors: [19×3 double]

   Accuracy of Estimation
              MeanReprojectionError: 0.1588
                 ReprojectionErrors: [156×2×19 double]
                  ReprojectedPoints: [156×2×19 double]

   Calibration Settings
                        NumPatterns: 19
                        WorldPoints: [156×2 double]
                         WorldUnits: 'millimeters'
                       EstimateSkew: 0
    NumRadialDistortionCoefficients: 2
       EstimateTangentialDistortion: 0

查看相机的内参矩阵,径向畸变和切向畸变。

>> cameraParams.IntrinsicMatrix

ans =

  657.5484         0         0
         0  658.0735         0
  303.5149  244.9321    1.0000

>> cameraParams.RadialDistortion

ans =

   -0.2526    0.1200

>> cameraParams.TangentialDistortion

ans =

     0     0

应用:

相机参数标定到底怎么用(参考教程:https://blog.csdn.net/Aoulun/article/details/78768570

对于单目视觉而言,实际上是没有必要知道世界坐标系的(没必要去探究这一个相机处于世界坐标坐标系的什么位置)。如果采用单目视觉的立体图像匹配,或者空间位置定位,应该需要用到空间位置信息。那么,在通常的单目视觉应用中,求得内参和畸变参数后,就可以对新拍摄的图像做变换和矫正。矫正完拍摄的图像之后,就可以对图像做其他处理了。

对于双目视觉而言,需要用到世界坐标系。对单目视觉做完内参和畸变参数的矫正之后,就可以用这些变换后的图像,同时结合世界坐标系实现定位或者其他目的了。

可以使用这些参数来校正镜头失真,以世界单位测量对象的大小,或确定场景中摄像机的位置。这些任务用于机器视觉等应用程序,以检测和测量对象。它们还用于机器人,导航系统和三维场景重建。

内在算法:

计算机视觉工具箱校准算法使用Jean-Yves Bouguet 提出的相机模型。

该模型包括:针孔相机模型[1]。镜头失真[2]。

针孔相机模型不考虑镜头失真,因为理想的针孔相机没有镜头。为了准确地表示真实的相机,算法使用的完整相机模型包括径向和切向镜头失真。

[1] Zhang, Z. “A Flexible New Technique for Camera Calibration.” IEEE Transactions on Pattern Analysis and Machine Intelligence. Vol. 22, No. 11, 2000, pp. 1330–1334.

详细:https://blog.csdn.net/qq_40369926/article/details/89251296(与计算机视觉:一种现代方法2nd1.3原理基本一致)

[2] Heikkila, J., and O. Silven. “A Four-step Camera Calibration Procedure with Implicit Image Correction.” IEEE International Conference on Computer Vision and Pattern Recognition.1997.

参考了一下标定图片的拍摄规范:https://blog.csdn.net/j_shui/article/details/77262947/

标定图片要求:

  1. 棋盘格角点不能缺失,必须全部拍到。
  2. 棋盘格需要贴在一个平面板上,保证棋盘格角点共面。
  3. 棋盘格姿态尽可能多一些变化。
  4. 尽可能在视场的不同范围内多拍一些,也就是说不要只有在中间的,边缘也要有。
  5. 数量上最好超过20张。

这个测试是相当的不标准了!

突发奇想的作死

目的:高质量图片(图片更大)工具箱能否测的更准

材料:拍摄格子5张照片,实际测量格子边长34mm

原图直接上,导入成功19、23和24

cameraParams = 

  cameraParameters - 属性:

   Camera Intrinsics
                    IntrinsicMatrix: [3×3 double]
                        FocalLength: [3.5824e+03 3.7126e+03]
                     PrincipalPoint: [1.9056e+03 1.4539e+03]

                               Skew: 0
                   RadialDistortion: [1.0385 -7.0385]
               TangentialDistortion: [0 0]
                          ImageSize: [3024 4032]

   Camera Extrinsics
                   RotationMatrices: [3×3×3 double]
                 TranslationVectors: [3×3 double]

   Accuracy of Estimation
              MeanReprojectionError: 9.8067
                 ReprojectionErrors: [15×2×3 double]
                  ReprojectedPoints: [15×2×3 double]

   Calibration Settings
                        NumPatterns: 3
                        WorldPoints: [15×2 double]
                         WorldUnits: 'millimeters'
                       EstimateSkew: 0
    NumRadialDistortionCoefficients: 2
       EstimateTangentialDistortion: 0

这个数值超大,不由得??

把照片按比例缩小了一下,长度为500:

cameraParams = 

  cameraParameters - 属性:

   Camera Intrinsics
                    IntrinsicMatrix: [3×3 double]
                        FocalLength: [432.9521 432.9042]
                     PrincipalPoint: [188.8020 250.5935]

                               Skew: 0
                   RadialDistortion: [0.0379 0.0060]
               TangentialDistortion: [0 0]

                          ImageSize: [500 375]

   Camera Extrinsics
                   RotationMatrices: [3×3×4 double]
                 TranslationVectors: [4×3 double]

   Accuracy of Estimation
              MeanReprojectionError: 0.0425
                 ReprojectionErrors: [12×2×4 double]
                  ReprojectedPoints: [12×2×4 double]

   Calibration Settings
                        NumPatterns: 4
                        WorldPoints: [12×2 double]
                         WorldUnits: 'millimeters'
                       EstimateSkew: 0
    NumRadialDistortionCoefficients: 2
       EstimateTangentialDistortion: 0

把图片再次缩小,长度为300:

cameraParams = 

  cameraParameters - 属性:

   Camera Intrinsics
                    IntrinsicMatrix: [3×3 double]
                        FocalLength: [260.9352 260.0080]
                     PrincipalPoint: [113.7241 153.0460]

                               Skew: 0
                   RadialDistortion: [0.0178 0.0718]
               TangentialDistortion: [0 0]
                          ImageSize: [300 225]

   Camera Extrinsics
                   RotationMatrices: [3×3×4 double]
                 TranslationVectors: [4×3 double]

   Accuracy of Estimation
              MeanReprojectionError: 0.0350
                 ReprojectionErrors: [12×2×4 double]
                  ReprojectedPoints: [12×2×4 double]

   Calibration Settings
                        NumPatterns: 4
                        WorldPoints: [12×2 double]
                         WorldUnits: 'millimeters'
                       EstimateSkew: 0
    NumRadialDistortionCoefficients: 2
       EstimateTangentialDistortion: 0

在使用Matlab体验照相机的标定过程中,对测试图像大小进行了按比例缩放,发现得到的照相机参数有所不同。

对于不同尺寸的照片,由于内参数中的α和贝塔是图像u轴和v轴上的尺度因子,像素/米*焦距,以及坐标和畸变参数,不同尺寸照片内参数矩阵不同。
结合原理应当是合理现象。因为内参数中有比例因子(像素除以米),所以照相机的标定结果不仅仅和照相机本身有关,还与拍摄出的图片有关系,在照相机的标定中,图像缩放应当会影响照相机标定的准确度。(reprojection errors,以此为准确度量化结果的合理性有待验证)

结合内参数的推导过程,图像按比例放大或者缩小,那么其坐标变化可以写成x'=mx,y'=ny,c0与c的距离uo。vo应当也是如此。(有待验证)

附:opencv实现https://my.oschina.net/abcijkxyz/blog/787659

https://blog.csdn.net/weixin_43848422/article/details/89302724

https://blog.csdn.net/weixin_41695564/article/details/80422329

 

 

 

发布了46 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_36808245/article/details/100814645