需要一些帮助来解决问题。也许有人正在研究这个并且知道解决方案......
目前我正在设计一个 Android 应用程序,它使用智能手机摄像头和来自通过 BLE 通道接收的设备的信息来表示该设备在手机屏幕上的真实位置。在允许我们获得这种表示的计算过程中,我们使用相机 FOV 来指示对象是否可见或在电话屏幕的左侧或右侧、顶部或底部的视图之外。垂直和水平的 FOV 值可以通过以下代码计算:
public static void updateCameraFov(@NonNull CameraCharacteristics characteristics) {//final double vertical, final double horizontal) {
float[] l_maxFocus = characteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
SizeF l_size = characteristics.get(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE);
if (l_maxFocus != null && l_size != null) {
double l_x = 2.0f * Math.atan(l_size.getWidth() / (2.0f * l_maxFocus[0])),
l_y = 2.0f * Math.atan(l_size.getHeight() / (2.0f * l_maxFocus[0]));
s_cameraThetaV = l_x;
s_cameraThetaH = l_y;
Log.d("CAMERA_DEBUG", s_cameraThetaV + "; " + s_cameraThetaH);
}
}
实际上,FOV 值是使用相机矩阵的物理特性,所以理论上计算应该对我们有效。我们正在执行一些实验来分析我们是否将所有内容都放在了正确的位置,并且屏幕上的设备位置是否显示得更准确,没有任何巨大的失真。但根据我们使用 3 款不同手机获得的结果,根据硬件特性计算的 FOV 与我们使用结果计算的 FOV 不相等。据我们了解,相机矩阵的活动区域可能不等于完整的物理尺寸。但是我们不知道如何获得有关该活动区域在矩阵上的位置的信息。它是放置在矩阵的中心,还是更多地附着在矩阵的某个角落。我们无法硬编码任何系数来补偿这两个 FOV 之间的这种偏移,因为每个带摄像头的智能手机都有不同大小的不同矩阵,并且可能活动区域的大小也可能不同。那么,问题是我们如何才能获得该活动区域的真实 FOV 以及如何知道它是如何放置的?
提前致谢