Android Camera2获取摄像头的视场角(FOV)信息

2023-09-18 22:08:28

一、概念

FOV(Field of View)是一个用于描述视野范围的术语。它通常用于计算设备(如摄像机、虚拟现实头显或眼睛)所能捕捉到的可见区域。

  1. 水平FOV(Horizontal FOV):描述视野在水平方向上的范围,通常以度(°)或弧度(rad)为单位。
  2. 垂直FOV(Vertical FOV):描述视野在垂直方向上的范围,同样通常以度或弧度为单位。
  3. 对角线FOV(Diagonal FOV):描述视野对角线方向上的范围,通常以度或弧度为单位。

FOV的大小会影响到用户或设备所能看到的景象的广度和逼真程度。较大的FOV可以提供更广阔的视野,使用户感到更加沉浸在虚拟现实环境或更好地观察到摄像机捕捉到的场景。然而,较大的FOV通常需要更复杂的设备和技术来实现。

在摄影和计算机图形学中,FOV也经常与焦距(focal length)、相机镜头和投影类型(例如透视投影或正交投影)一起使用,以影响图像的外观和透视效果。不同的FOV设置可以用来创造不同的视觉效果,从而满足特定的需求和创意要求。

二、计算方式

请添加图片描述

如图所示,要计算FOV,只要我们拿到传感器的长度SensorSize,摄像头的焦距FocalLength,就可以由三角函数计算得到FOV了,即:
tan ⁡ ( 1 2 ∗ F O V ) = ( 1 2 ∗ S e n s o r S i z e ) / F o c a l L e n g t h \tan{(\frac{1}{2} * FOV)}=(\frac{1}{2} * SensorSize) / FocalLength tan(21FOV)=(21SensorSize)/FocalLength
可得:
F O V = 2 ∗ arctan ⁡ ( ( 1 2 ∗ S e n s o r S i z e ) / F o c a l L e n g t h ) FOV=2*\arctan{((\frac{1}{2} * SensorSize) / FocalLength)} FOV=2arctan((21SensorSize)/FocalLength)

三、代码

CameraManager cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
try {
	String[] cameraIdList = cameraManager.getCameraIdList();
	for (int i = 0; i < cameraIdList.length; i++) {
		Log.v(TAG, "valid camera id: " + cameraIdList[i]);
		CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraIdList[i]);
		// 获取传感器的尺寸
        SizeF sensorSize = cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE);
        float[] floats = cameraCharacteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
        Log.d(TAG, "focal Lengths: " + Arrays.toString(floats));
        float focalLength = cameraCharacteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS)[0];
        float horizontalFov = (float) (2 * Math.toDegrees(Math.atan(sensorSize.getWidth() / (2 * focalLength))));
        float verticalFov = (float) (2 * Math.toDegrees(Math.atan(sensorSize.getHeight() / (2 * focalLength))));
        Log.d(TAG, "horizontalFov: " + horizontalFov + ", verticalFov: " + verticalFov);
	}
} catch (CameraAccessException e) {
    e.printStackTrace();
}
更多推荐

132.【MySQL_进阶】

MySQL_进阶(一)、存储引擎1.MySQL体系结构(1).连接层(2).服务层(3).引擎层(4).存储层2.存储引擎简介(1).查看某张表的数据引擎(2).展示此版本支持的所有存储引擎(3).创建表my_myisam,并指定MyIASM存储引擎(4).存储引擎示列3.存储引擎_Innodb(1).Innodb介绍

赛宁党支部赴延安开展革命旧址学习主题党日活动

为深入学习贯彻新时代中国特色社会主义思想和中共二十大精神,不断提升党支部成员综合素质和业务能力,2023年9月,赛宁公司党支部组织北京、南京、广州等三地部分党员及入党积极分子开展了“革命旧址学习”主题党日活动,深入寻访延安革命纪念馆、杨家岭、枣园革命旧址等红色基地,重温入党誓词,感悟辉煌历史,凝聚前进力量。“走进革命纪

K8S-Pod 进阶

Pod进阶一、资源限制(业务cpu内存)1.定义2.Pod和容器的资源请求和限制3.CPU资源单位4.内存资源单位5.示例二、健康检查:又称为探针(Probe)1.定义2.探针的三种规则:3.Probe支持三种检查方法4.示例三、扩展1.pod的状态2.Container生命周期四、总结1.资源限制2.Pod容器探针3

JS响应替换|解决谷歌验证码混淆js还原替换后的跨域问题

关注它,不迷路。本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!1.目标地址夜幕爬虫安全论坛的登录页面有个谷歌验证码:其地址是:https://bbs.nightteam.cn/member.php?mod=logging&action=login它的混淆js地

【Xilinx】基于MPSoC的OpenAMP实现(一)

【Xilinx】基于MPSoC的OpenAMP实现(一)一、开发环境1、开发思路2、下载官方bsp包二、编译Linux1、配置petalinux环境变量2、创建工程3、进入目录4、设置缓存目录(重点:可离线编译,加快编译速度)5、配置u-boot6、配置内核6.1增加内核选项(重点:没有正确选择会导致运行时各种奇怪的报

Linux常用命令—find命令大全

文章目录一、find命令常用功能1、find命令的基本信息如下。2、按照文件名搜索3、按照文件大小搜索4、按照修改时间搜索5、按照权限搜索举例:6、按照所有者和所属组搜索7、按照文件类型搜索8、逻辑运算符一、find命令常用功能1、find命令的基本信息如下。命令名称:find。英文原意:searchforfilesi

怎么设置IP白名单

IP白名单是一种网络安全机制,用于限制只允许特定的IP地址或IP地址范围通过访问控制。在本文中,我将详细解释IP白名单的概念、用途以及如何设置IP白名单。**1.什么是IP白名单?**IP白名单是一种访问控制列表,它允许或阻止特定的IP地址或IP地址范围对系统、应用程序或网络进行访问。只有在白名单中的IP地址被授权通过

C++ std::unique_lock 用法

文章目录1.创建std::unique_lock对象2.自动加锁和解锁3.延迟加锁与手动加解锁4.尝试加锁5.配合条件变量使用6.小结参考文献std::unique_lock是C++11提供的一个用于管理互斥锁的类,它提供了更灵活的锁管理功能,适用于各种多线程场景。1.创建std::unique_lock对象std::

【面试刷题】——Qt事件处理器级别的划分

在Qt中,事件处理器(EventHandler)可以分为不同的级别,以适应不同的需求和场景。以下是Qt事件处理器级别的划分:应用程序级别事件处理器:这是最高级别的事件处理器,通常用于处理应用程序范围内的事件,如全局快捷键、自定义应用程序级别的事件等。应用程序级别事件处理器可以通过继承QCoreApplication或使

浅谈电气防火保护器在地下商场的应用 安科瑞 缪阳扬

摘要:近年来,我国城市发展速度加速。很多城市大力建造地下建筑设施,比如地铁、地下停车场和地下商场等。地下商场属于人员密集型建筑,其防火设计一直令相关的专家头疼。由于人员密集,防火处理不好将酿成灾难性的后果。因此,防火十分重要。防火设计可以着重于疏散和火灾探查报警系统两个方面,而电气火灾监控系统在实际预警和报警过程中有着

vector的扩容机制—为何是1.5倍或者是2倍

文章目录前言一、Vector扩容过程二、为什么是1.5倍或者2倍?前言在C++编程中,Vector是一种常用的动态数组容器。其大小是可以动态调整的,而在扩容操作中,Vector通常会将容量增加为原来的两倍。本篇博客将详细介绍Vector扩容的原理、扩容过程,并解释为何选择两倍进行扩容。一、Vector扩容过程当向vec

热文推荐