获取android相机设备的视角

Posted

技术标签:

【中文标题】获取android相机设备的视角【英文标题】:Get angle of view of android camera device 【发布时间】:2015-09-19 06:54:17 【问题描述】:

我想知道摄像头的视角,就像在this 问题中一样,但使用的是android.hardware.camera2。如何使用新的 camera2 库重现下一个代码。

Camera.Parameters p = camera.getParameters();
double thetaV = Math.toRadians(p.getVerticalViewAngle());
double thetaH = Math.toRadians(p.getHorizontalViewAngle());

有没有办法做同样的事情?

【问题讨论】:

如何使用camera2 API:***.com/questions/67375781/… 【参考方案1】:

我在谷歌上搜索了一个人显示他通过 Camera2 api 计算 FOV 的可能性

https://photo.stackexchange.com/questions/54054/calculating-the-field-of-view-for-a-nexus-5

找到方程

http://www.bobatkins.com/photography/technical/field_of_view.html

FOV(直线)= 2 * arctan(帧大小/(焦距 * 2))

因此,我们需要知道帧大小焦距

帧大小是相机的大小,您可以在下面的链接中找到代码

https://***.com/a/30403558

另外,焦距可以在下面的链接中找到

Manual focus in camera2, android

我像这样组合代码

一个函数calculateFOV()计算FOV角度

https://github.com/pchan1401-ICIL/Camera2FOV

【讨论】:

非常好的文章!我目前对 Camera 2 API 让开发人员更加困难感到震惊。我认为连续的 API 集旨在增加功能。【参考方案2】:

就我的研究而言,答案是否定的。使用camera2 API,没有可以为您提供垂直和水平视角的调用。

但是,您不需要使用camera2 API 来获取这些值。您可以只使用原始的camera API 来获取垂直和水平视角,然后使用camera2 API 来获取应用程序的其余部分。

据我所知,相机和camera2 API 之间的实际图像捕捉固件没有变化。

【讨论】:

非常糟糕的答案,可以计算,有传感器尺寸、焦距和其他可用数据。 You can just use the original camera == Just use deprecated API - 太聪明了!...【参考方案3】:

你可以在数学上做到这一点。

你有:

L,对象的宽度 d,到物体的距离

您要计算角度a (alpha),即视野。

做一些触发:

tan(a/2) = (L/2)/d
tan(a/2) = L/2d
a/2 = atan(L/2d)
a = 2*atan(L/2d)

您可以这样做来计算水平视野。祝你好运!

【讨论】:

我知道那个解决方案,但这不是我想要的,因为用户需要进行校准,并且在达到那个点之前已经有很多步骤,我不想让用户不知所措一个能够知道 d 和 L 的更多步骤 哦,是的......对不起,我不知道更好的解决方案:P【参考方案4】:

使用camera2 API,我们可以这样做:

val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
val cameraCharacteristics = cameraManager.getCameraCharacteristics("0") // hardcoded first back camera id

val focalLength = cameraCharacteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS)?.firstOrNull() ?: return
val sensorSize = cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE) ?: return
val horizontalAngle = (2f * atan((sensorSize.width / (focalLength * 2f)).toDouble())) * 180.0 / Math.PI
val verticalAngle = (2f * atan((sensorSize.height / (focalLength * 2f)).toDouble())) * 180.0 / Math.PI

// using camera2 API we got the same data as with legacy Camera API (with it was easier):
// val parameters = camera.getParameters()
// val horizontalAngle = parameters.getHorizontalViewAngle()
// val verticalAngle = parameters.getVerticalViewAngle()

但通常这些值适用于 4:3 纵横比,如果您需要 16:9 纵横比或其他值,请查看Without additional calculation Camera or camera2 APIs return FOV angle values for 4:3 aspect ratio by default?

【讨论】:

以上是关于获取android相机设备的视角的主要内容,如果未能解决你的问题,请参考以下文章

android 的默认图库和相机意图是不是适用于所有设备?

即使 autoRotation 关闭,也能获取 android 设备方向

(转)使用OpenGL显示图像运用投影与相机视角

Android Camera getCameraIdList流程 (android P)

一致地从 Android 供应商的 MediaStore 加载照片(由相机拍摄)

相机预览在少数 Android 设备上延伸