概述
在尝试使用
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)是有源像素阵列中的左上角像素,我将其读作旋转传感器坐标系中捕获的图像所需的角度
到使图像在原始方向看起来直立的位置.因此,如果传感器的顶部朝向具有纵向原始方向的手机的右侧,则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.
我发现这个定义比传感器定位更清晰,没有解释的地方.
现在事情开始变得难看……
我决定使用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;
从计算的内容来看,它实际上更合乎逻辑……
有人能证实吗?或者我在某处误解了什么?
干杯
最后
以上就是落后小懒虫为你收集整理的Android 相机方向传感,android – Camera2了解传感器和设备方向的全部内容,希望文章能够帮你解决Android 相机方向传感,android – Camera2了解传感器和设备方向所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复