【问题标题】:Field of view of a GoPro cameraGoPro 摄像机的视野
【发布时间】:2016-10-13 14:05:52
【问题描述】:

我已经使用 Matlab 的相机校准工具箱校准了我的 GoPro Hero 4 Black,并使用 OpenCVcalibrationMatrixValues() 计算了它的视野和焦距。但是,这些与 GoPro 的规格不同。我得到了 95.4/63.4 和 2.8mm 而不是 17.2mm 的焦距,而不是 118.2/69.5 FOV。显然有些不对劲。

我认为校准本身是正确的,因为图像不失真似乎运作良好。

谁能给我一个提示,我在哪里犯了错误?我在下面发布我的代码。

谢谢。

代码

cameraMatrix = new Mat(3, 3, 6);
for (int i = 0; i < cameraMatrix.height(); i ++)
    for (int j = 0; j < cameraMatrix.width(); j ++) {
    cameraMatrix.put(i, j, 0);
}
cameraMatrix.put(0, 0, 582.18394);
cameraMatrix.put(0, 2, 663.50655);
cameraMatrix.put(1, 1, 582.52915);
cameraMatrix.put(1, 2, 378.74541);
cameraMatrix.put(2, 2, 1.);

org.opencv.core.Size size = new org.opencv.core.Size(1280, 720);
//output parameters
double [] fovx = new double[1];
double [] fovy = new double[1];
double [] focLen = new double[1];
double [] aspectRatio = new double[1];
Point ppov = new Point(0, 0);
org.opencv.calib3d.Calib3d.calibrationMatrixValues(cameraMatrix, size,
        6.17, 4.55, fovx, fovy, focLen, ppov, aspectRatio);


System.out.println("FoVx: " + fovx[0]);
System.out.println("FoVy: " + fovy[0]);
System.out.println("Focal length: " + focLen[0]);
System.out.println("Principal point of view; x: " + ppov.x + ", y: " + ppov.y);
System.out.println("Aspect ratio: " + aspectRatio[0]);

结果

FoVx: 95.41677635378488
FoVy: 63.43170132212425
Focal length: 2.8063085232812504
Principal point of view; x: 3.198308916796875, y: 2.3934605770833333
Aspect ratio: 1.0005929569269807

GoPro 规格

https://gopro.com/help/articles/Question_Answer/HERO4-Field-of-View-FOV-Information

编辑

Matlab 标定结果

Focal Length:          fc = [ 582.18394   582.52915 ] ± [ 0.77471   0.78080 ]
Principal point:       cc = [ 663.50655   378.74541 ] ± [ 1.40781   1.13965 ]
Skew:             alpha_c = [ -0.00028 ] ± [ 0.00056  ]   => angle of pixel axes = 90.01599 ± 0.03208 degrees
Distortion:            kc = [ -0.25722   0.09022   -0.00060   0.00009  -0.01662 ] ± [ 0.00228   0.00276   0.00020   0.00018  0.00098 ]
Pixel error:          err = [ 0.30001   0.28188 ]

用于校准的图像之一

以及未失真的图像

【问题讨论】:

    标签: opencv computer-vision camera-calibration gopro fieldofview


    【解决方案1】:

    您在 OpenCV 中输入了 6.17mm 和 4.55mm 作为传感器尺寸,这对应于纵横比 1.36,而您的分辨率 (1270x720) 为 1.76(大约 16x9 格式)。 您是否在 MATLAB 校准之前裁剪了图像?

    像素大小似乎与this Gopro page 相差 1.55µm(顺便说一句,这小得惊人!)。如果像素是平方的,并且它们应该在这种类型的商业相机上,这意味着您的输入不连贯。计算出的传感器尺寸应为:

    [传感器宽度,传感器高度] = [1280, 720]*1.55*10^-3 = [1.97, 1.12] 毫米

    即使考虑到最大视频分辨率为 3840 x 2160,我们得到[5.95, 3.35]mm,仍然与您的输入不同。

    请查看此explanation about equivalent focal length 以了解为什么相机的实际焦距不是 17.2 而是17.2*5.95/36 ~ 2.8mm。在这种情况下,例如使用公式 here 计算 FOV。您确实会发现 93.5°/61.7° 的值(接近您的输出,但仍不是规格中所写的值,因为广角可能会导致一些光学失真)。

    但我不明白的是,返回的焦距如何正确,而输入的传感器尺寸错误。您能否提供更多信息和/或发送图片?

    问题更新后的编辑

    在工作分辨率为 1280x720 的相机上,图像被降采样但未裁剪,因此我上面所说的关于传感器尺寸的内容不适用。如您的第一条评论中所述,要考虑的传感器尺寸确实是使用的(6.17x4.55)。

    FOV 受以像素和分辨率给出的校准矩阵输入(fx、fy、cx、cy)的约束。您可以输入以下内容进行检查:

    2*DEGRES(ATAN(1280/(2*582.18394))) (=95.416776...°)

    此 FOV 值小于预期值,但从未失真图像的外观来看,您的 MATLAB 失真模型是正确的,并且校准是正确的。您应用的重新扭曲似乎很好地纠正了由于广角引起的桶形失真。

    但是,MATLAB 工具箱使用针孔模型,该模型是线性的,无法考虑镜头畸变等内在参数。我从页面上假设:

    https://fr.mathworks.com/help/vision/ug/camera-calibration.html

    因此,我最好的猜测是,除非您找到更准确地适合 Gopro 相机的模型(可能是广角镜头模型),否则 MATLAB 校准将返回与“线性”未失真图像相对应的固有相机矩阵,并且FOV 确实会更小(在桶形失真的情况下)。您必须应用与校准相关的失真系数来检索实际 FOV 值。

    我们可以在校正后的图像中看到,FOV 的侧面部分被拒绝出界。如果您完全扭曲了图像,您会发现一些未失真的像素坐标超过了[-1280/2;+1280/2](水平方向,垂直方向同上)。然后,将opencv.core.Size(1280, 720) 替换为获得的最极端范围,您有望检索到 Gopro 网站值。

    总之,如果你在图像的中心进行测量,我认为你可以依靠你获得的焦距值,否则会有太多的失真,它不适用。

    【讨论】:

    • 非常感谢您的回答。我在这里找到了传感器的尺寸vfxcamdb.com/category/camera/gopro。无论如何,如果我改变传感器的尺寸,calibrationMatrixValues(...) 返回的视野不会改变。我假设此计算所需的所有数据均取自相机的校准矩阵。然而,改变的是焦距,然后等于 ~0.9mm(当我将传感器的尺寸更改为 1.97 和 1.12 时)。
    • 我在上面的帖子中包含了更多数据。
    • 我没有找到有关传感器尺寸的信息,但是当您拥有 Gopro 信息时,您确实应该依赖它们。那么我的错误:我猜像素之间有一些间距,并且在较低分辨率下的下采样实际上会增加像素间距。关于焦点的结果现在对我来说很有意义。关于 FOV 差异,您是否尝试过使用适用于鱼眼镜头的畸变模型进行校准?
    • 我刚刚尝试使用鱼眼模型进行相机校准,我得到了一个几乎相同的相机矩阵,而只有鱼眼畸变系数不同,使用它们进行图像不畸变不会产生好的结果。至于相机校准,我使用了 19 张图像。我不确定下一步该做什么。也许我只是误解了生成的 FOV?
    • 哦,是的,材料是刚性和平坦的。
    猜你喜欢
    • 2011-11-26
    • 2012-03-04
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2015-11-11
    • 2019-09-01
    相关资源
    最近更新 更多