- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在尝试使用 Android Camera2 实现触摸对焦功能时遇到了问题.
理论很简单:
MeteringRectangle
并在新的 CaptureRequest
中使用它有许多示例展示了如何处理第一点和最后一点,但以可理解的方式处理第二点和第三点的示例并不多。文档和示例不是很清楚,可能真的很困惑。
我们开始...
CameraCharacteristics.SENSOR_ORIENTATION
描述为
Clockwise angle through which the output image needs to be rotated to be upright on the device screen in its native orientation.
知道传感器坐标系定义为 (0,0) 是 Activity 像素阵列中左上角的像素,我将其解读为旋转传感器坐标系中捕获的图像所需的角度到使图像在原始方向上看起来直立的位置。因此,如果传感器的顶部面向手机的右侧,并且原生纵向,则 SENSOR_ORIENTATION
将为 90°。
mActivity.getWindowManager().getDefaultDisplay().getRotation();
获取的
显示方向记录为:
Returns the rotation of the screen from its "natural" orientation. The returned value may be Surface.ROTATION_0 (no rotation), Surface.ROTATION_90, Surface.ROTATION_180, or Surface.ROTATION_270. For example, if a device has a naturally tall screen, and the user has turned it on its side to go into a landscape orientation, the value returned here may be either Surface.ROTATION_90 or Surface.ROTATION_270 depending on the direction it was turned. The angle is the rotation of the drawn graphics on the screen, which is the opposite direction of the physical rotation of the device. For example, if the device is rotated 90 degrees counter-clockwise, to compensate rendering will be rotated by 90 degrees clockwise and thus the returned value here will be Surface.ROTATION_90.
我发现这个定义比sensor orientation定义清楚多了,没有解释的地方。
现在事情开始变得丑陋了......
我决定使用 Camera2Raw 中提供的方法例如,获取从传感器方向到设备方向的旋转。
/**
* Rotation need to transform from the camera sensor orientation to the device's current
* orientation.
*
* @param c the {@link CameraCharacteristics} to query for the camera sensor
* orientation.
* @param deviceOrientation the current device orientation relative to the native device
* orientation.
* @return the total rotation from the sensor orientation to the current device orientation.
*/
private static int sensorToDeviceRotation(CameraCharacteristics c, int deviceOrientation) {
int sensorOrientation = c.get(CameraCharacteristics.SENSOR_ORIENTATION);
// Get device orientation in degrees
deviceOrientation = ORIENTATIONS.get(deviceOrientation);
// Reverse device orientation for front-facing cameras
if (c.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT) {
deviceOrientation = -deviceOrientation;
}
// Calculate desired JPEG orientation relative to camera orientation to make
// the image upright relative to the device orientation
return (sensorOrientation + deviceOrientation + 360) % 360;
}
我注意到的第一件事是,如果我考虑所描述的输出(从相机传感器方向到设备当前方向的旋转),为了有意义,我必须考虑输出旋转是逆时针(不同于传感器方向和设备方向)!例如,如果我们采用典型的 90° 传感器和 0° 设备方向,结果是 90°,如果我的分析没有弄错的话,它只能是逆时针方向。
假设我对传感器和设备方向的理解是正确的(对此不确定),那么上表的结果一定有问题,因为如果你看 90° 传感器和 90°设备方向情况下,不能是 180°,应该是 0°。下一张图片是我对 90° 传感器方向手机所有这些的理解的直观表示。
我继续在 R2 中实现我的基础更改,以将我的点击点从屏幕基础变为传感器基础,并添加预期的偏移量。
我观察到,如果我切换 180° 和 0° 计算,那么我的触摸对焦效果很好。从传感器到当前设备方向的旋转的正确观察值实际上对应于前置摄像头的表格。
所以我的直觉是 sensorToDeviceRotation
有缺陷,返回值应该是:
// Calculate desired JPEG orientation relative to camera orientation to make
// the image upright relative to the device orientation
return (sensorOrientation - deviceOrientation + 360) % 360;
就计算的内容而言,它实际上更符合逻辑......
有人可以证实这一点吗?还是我在某处误解了什么?
干杯
最佳答案
是的,这是 Camera2Raw 中的一个错误;谢谢你捕获它。
如果您比较 Camera#setDisplayOrientation 的引用文档中的示例代码,你会看到你期望的数学:
...
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
} else { // back-facing
result = (info.orientation - degrees + 360) % 360;
}
关于android - Camera2 了解传感器和设备方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48406497/
我想通过自己编写的C API来控制一些物理引擎,开关,灯光。 我已经对如何实现这一目标有了一个非常全面的概述: 使用内核抽象,在其上编写驱动程序并将其用作控制。驱动程序本身必须管理传入字节并解释它们(
过去做过一些 Android 开发,但已经有一段时间了 - 想构建一个使用方向和接近传感器的应用程序。所以... mSensorManager = (SensorManager) getSystemS
Android SDK 实际上提供了一个很好的接口(interface)来访问传感器。但是例如线性加速度传感器可以评估为 documentation从重力和加速度描述 - 所以这个传感器没有真正的物理
我是 android 开发的新手,我需要查看 android 3.1 设备上的传感器列表。 我有这个代码: package milos.exemplesensorlist; import java.u
我正在尝试为网络传感器实现虫洞攻击检测程序。我在互联网上四处寻找这方面的源代码,但一无所获。有谁知道在哪里可以找到虫洞传感器攻击(用于模拟目的)或虫洞检测的源代码?如果是这样,在哪里?它可以是任何编程
有没有办法使用内置传感器从 Android 手机获取二氧化碳。目前我通过环境传感器获得的是当前速度、气压、湿度和噪音幅度。 如果这是不可能的,有没有一种方法可以计算二氧化碳(该值可以是估计值)? 最佳
我正在尝试访问我的 Samsung Galaxy S3 上的传感器(特别是接近传感器和 RGBW 传感器),并且已获得可运行的代码来访问接近传感器。但是,我只得到值 1 或 8(近/远)。我知道有时硬
我想知道是否可以通过javascript获取诺基亚5800的传感器值。我知道在 HTML5 中有一个事件 DeviceOrientationEvent 可以提供一些值。但由于诺基亚 5800 没有 H
我想知道如何正确使用“旋转 vector 传感器”的输出。目前我想到了以下内容,并想根据 result[] 计算偏航和俯仰,以便了解设备指向的位置(处于横向模式)。但我对结果有疑问。偏航计算非常精确,
我正在编写一个方法,如果存在并启用了 GPS 传感器,该方法将返回 true,但如果不存在或已关闭,则返回 false。事实证明这很难,因为... hasSystemFeature("FEATURE_
我正在尝试从 Samsung Galaxy Tab GT-P1000 读取多个传感器,相对于我使用的应用程序,它们似乎非常占用 CPU。 作为测试,我创建了一个简短的程序,它为加速度计传感器实现了 S
我正在像这样从重新启动的接收步骤创建一个演示。 public class MainActivity extends AppCompatActivity implements SensorEventLi
我正在开发用于汽车加速跟踪的应用程序。我使用标准加速度计,事先在特定位置进行校准。 然后,假设手机的方向没有改变,我记录了指定时间的加速度计数据并计算了移动参数,其中之一是测试结束时汽车的速度。 在笔
下面是API中定义的几个代表sensor的常量。 Int TYPE_ACCELEROMETER A constant desc
我使用的 Arduino 具有多个 (3) 个传感器,使用正常模式(非寄生模式)连接到数字引脚 2。 其中两个传感器是使用库“OneWire”(Library Page)和“DallasTempera
我想让 android 传感器与 opengl 一起工作,以将 opengl 的相机旋转到手机指向的任何地方。 详细说明:如果玩家正在看东方,我希望 opengl 的相机在游戏中也指向东方;如果玩家指
我正在使用 Google Cardboard(它的 HeadTracker 类)来检测 AR 应用程序中有关设备旋转的某些事情。效果很好。 但是,在某些设备上,它不起作用(没有任何反应)。我认为这是因
是否有适用于 Apple Watch Kit 传感器(例如加速度计、心率监测器、触觉传感器)的 API? 我如何访问这些传感器? 最佳答案 WatchOS 2.0 的 Watchkit 中现已提供传感
我正在学习如何使用 Pyfst 创建换能器,并且我正在尝试可视化我创建的换能器。最终目标是能够将传感器写入点文件并在 Graphviz 中查看它们。 我拿了一个示例代码来看看如何可视化下面的接受器。
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我是一名优秀的程序员,十分优秀!