首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GoPro相机的视场

GoPro相机的视场
EN

Stack Overflow用户
提问于 2016-10-13 14:05:52
回答 1查看 3.3K关注 0票数 7

我已经校准了我的GoPro英雄4黑色使用相机校准工具箱的Matlab和计算其视场和焦距使用OpenCV的calibrationMatrixValues()。然而,这与GoPro的规范不同。118.2/69.5FOV为95.4/63.4,焦距为2.8mm,而非17.2mm。很明显有什么不对劲。

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

谁能给我个提示一下我哪里出了错?我在下面张贴我的代码。

谢谢。

代码

代码语言:javascript
复制
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]);

结果

代码语言:javascript
复制
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规范

答案/HERO4 4-视场-FOV-信息

编辑

Matlab标定结果

代码语言:javascript
复制
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 ]

用于校准的图像之一

和不失真的图像

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-14 21:57:59

您已经输入了6.17mm和4.55mm作为传感器大小的OpenCV,它对应于一个高宽比1.36,而由于您的分辨率(1270x720)是1.76 (大约16x9格式)。在MATLAB校准之前,你剪切了你的图像吗?

像素大小似乎是这个Gopro页面的1.55m(顺便说一句,这是惊人的小!)如果像素是平方的,他们应该在这种类型的商业相机,这意味着你的输入是不一致的。计算传感器的大小应为:

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

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

请看这个关于等效焦距的解释来理解为什么相机的实际焦距不是17.2,而是17.2*5.95/36 ~ 2.8mm。在这种情况下,使用公式这里计算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网站值。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40023288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档