获取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相机设备的视角的主要内容,如果未能解决你的问题,请参考以下文章
即使 autoRotation 关闭,也能获取 android 设备方向
Android Camera getCameraIdList流程 (android P)