Android 设备摄像机方向,不包括设备横向/纵向方向
我需要获得前向摄像头的方向,不包括设备方向(横向/纵向)。我试图用核心运动和访问设备的姿态来表示这一点。在这里,我尝试访问Euler角并排除偏航,但是,当旋转设备超过一个Euler角值时,这似乎不起作用。我也在考虑使用方向四元数,但我没有使用它们的经验。我需要以可序列化的方式获取这些信息,因为我以后需要确定其他设备的摄像头是否指向同一方向(该设备可能是iOS或Android)Android 设备摄像机方向,不包括设备横向/纵向方向,android,ios,orientation,augmented-reality,Android,Ios,Orientation,Augmented Reality,我需要获得前向摄像头的方向,不包括设备方向(横向/纵向)。我试图用核心运动和访问设备的姿态来表示这一点。在这里,我尝试访问Euler角并排除偏航,但是,当旋转设备超过一个Euler角值时,这似乎不起作用。我也在考虑使用方向四元数,但我没有使用它们的经验。我需要以可序列化的方式获取这些信息,因为我以后需要确定其他设备的摄像头是否指向同一方向(该设备可能是iOS或Android) 重申:如果用户将手机摄像头(主摄像头不是自拍摄像头)指向自由女神像,那么无论用户手持手机是纵向还是横向,编码此信息的最佳
重申:如果用户将手机摄像头(主摄像头不是自拍摄像头)指向自由女神像,那么无论用户手持手机是纵向还是横向,编码此信息的最佳方式是什么,这样,如果另一个用户在同一个位置,他会知道他的相机指向哪个方向 共有4种类型。一种是不推荐的:
val orientation: Int = resources.configuration.orientation
如果您想了解特定的角度和位置,您应该将传感器服务与this.sensorManager=getSystemService(Context.Sensor\u service)一起用作传感器管理器
和准确的位置
sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR)?。让{this.rotationVector=it}
这个类也有不同的特性,比如
TYPE_ACCELEROMETER
测量在所有三个物理轴(x、y和z)上施加到设备上的加速度,单位为m/s2,包括重力
运动检测(抖动、倾斜等)
测量在所有三个物理轴(x、y、z)上施加到设备上的重力,单位为m/s2
运动检测(抖动、倾斜等)
测量设备绕三个物理轴(x、y和z)的旋转速率(以rad/s为单位)
旋转检测(旋转、转弯等)
在没有重力的情况下,测量在所有三个物理轴(x、y和z)上施加到设备上的加速度,单位为m/s2
沿单轴监测加速度
TYPE_ROTATION_VECTOR
通过提供设备旋转矢量的三个元素来测量设备的方向
运动检测和旋转检测。我相信为了实现这一点,您可以使用CLLocation
。
由于您的主要目标是找到电话指向的基点,因此您可以执行以下操作:
fun locationManager(umanager:CLLocationManager,didUpdateHeading:CLHeading){
让角度=newHeading.trueHeading.toRadians//从度转换为弧度
//请随意使用此信息
}
如下列文件所述:
真航向是该矢量与从同一点开始但指向正北的矢量之间的角度。
如果你的手机正好指向正北,你会得到0度的航向,如果它指向东方,你会得到90度等等
现在,如上所述,设备方向可能会导致一些问题:
不幸的是,如果用户将设备定向到横向模式,报告的标题将不正确,或者至少在用户看来不正确。当你在本书后面看到增强现实接口时,这将变得特别重要;此类界面通常以横向左侧模式查看
但是!此问题有一个解决方案:
您可以使用类似这样的方法检索要查找的标题:
-(浮动)磁加载:(浮动)航向
fromOrientation:(UIDeviceOrientation)方向{
航向=航向;
开关(方向){1
案例UIDeviceOrientation纵向:
打破
案例UIDeviceOrientation肖像向上向下:
真航向=真航向+180.0f;
打破
案例UIDeviceOrientation和scapeLeft:
真航向=真航向+90.0f;
打破
案例UIDeviceOrientation和scapeRight:
真航向=真航向-90.0f;
打破
违约:
打破
}
同时(realHeading>360.0f){
realHeading=realHeading-360;
}
返回标题;
}
很抱歉使用了不同的语言(Swift-Objective C),但为了充分理解问题并找到完整的解决方案,我建议阅读以下来源:
希望这有帮助!让我知道。在安卓系统中,我使用setRotation()方法损坏相机。
setRotation(camera, parameters, requestedCameraId);
private void setRotation(Camera camera, Camera.Parameters parameters, int cameraId) {
WindowManager windowManager =
(WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
int degrees = 0;
//get current display rotation
int rotation = windowManager.getDefaultDisplay().getRotation();
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
default:
Log.e(TAG, "Bad rotation value: " + rotation);
}
CameraInfo cameraInfo = new CameraInfo();
Camera.getCameraInfo(cameraId, cameraInfo);
int angle;
int displayAngle;
if (cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT) {
angle = (cameraInfo.orientation + degrees) % 360;
displayAngle = (360 - angle) % 360; // compensate for it being mirrored
} else { // back-facing
angle = (cameraInfo.orientation - degrees + 360) % 360;
displayAngle = angle;
}
// This corresponds to the rotation constants.
// mRotation = angle / 90;
camera.setDisplayOrientation(displayAngle);
parameters.setRotation(angle);
}
我希望这对您有用。在哪里可以获得设备的航向和角度。。。如果我没弄错的话,这根本不能回答这个问题,横向左->-90.0f
和横向右->+90.0f
TYPE_LINEAR_ACCELERATION
TYPE_ROTATION_VECTOR
setRotation(camera, parameters, requestedCameraId);
private void setRotation(Camera camera, Camera.Parameters parameters, int cameraId) {
WindowManager windowManager =
(WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
int degrees = 0;
//get current display rotation
int rotation = windowManager.getDefaultDisplay().getRotation();
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
default:
Log.e(TAG, "Bad rotation value: " + rotation);
}
CameraInfo cameraInfo = new CameraInfo();
Camera.getCameraInfo(cameraId, cameraInfo);
int angle;
int displayAngle;
if (cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT) {
angle = (cameraInfo.orientation + degrees) % 360;
displayAngle = (360 - angle) % 360; // compensate for it being mirrored
} else { // back-facing
angle = (cameraInfo.orientation - degrees + 360) % 360;
displayAngle = angle;
}
// This corresponds to the rotation constants.
// mRotation = angle / 90;
camera.setDisplayOrientation(displayAngle);
parameters.setRotation(angle);
}