设备摄像头方向除了设备横向/纵向定位

4
我需要获取前置摄像头的方向,但要排除设备方向(横屏/竖屏)。我尝试使用Core Motion并访问设备姿态来实现这一点。在此,我尝试访问欧拉角并排除偏航角,但是当旋转设备时,超过一个欧拉角值会发生变化,因此此方法似乎不起作用。我还考虑使用方向四元数,但我没有使用它们的经验。我需要以可序列化的方式获得此信息,因为我稍后需要确定不同设备的摄像头是否指向相同的方向(该设备可以是iOS或Android)。
重申一下:如果用户将手机主摄像头对准自由女神像,无论用户是竖着还是横着拿着手机,哪种编码方式最好,以便于另一个用户在同一位置知道应该把他的相机指向哪个方向?
3个回答

2

我认为,为了实现这一目标,您可以使用 CLLocation。 由于您的主要目标是找到手机指向的基本方位,因此您可以执行以下操作:

fun locationManager(_ manager: CLLocationManager, didUpdateHeading heading: CLHeading) {
   let angle = newHeading.trueHeading.toRadians // convert from degrees to radians
   // do what you please with this information
}

正如这篇教程所述:

真北方向角是该向量与从同一点开始但指向真正北的向量之间的角度。 如果您的手机恰好指向真正的北方,您将获得0度(零)的角度,如果它指向东方,则您将获得90度等。

现在,就像这里所述,设备方向可能会导致一些麻烦:

不幸的是,如果用户将设备定位为横向模式,则报告的标题将不正确,或者至少对用户来说看起来不正确。当您稍后查看增强现实界面时,这将变得尤为重要;这些接口通常在左侧横向模式下查看。

但是!有一个解决此问题的方法:

您可以使用类似以下内容来检索所需的标题:
-(float)magneticHeading:(float)heading 
        fromOrientation:(UIDeviceOrientation) orientation {

    float realHeading = heading;
    switch (orientation) {1
          case UIDeviceOrientationPortrait:
               break;
          case UIDeviceOrientationPortraitUpsideDown:
               realHeading = realHeading + 180.0f;
               break;
          case UIDeviceOrientationLandscapeLeft:
               realHeading = realHeading + 90.0f;
               break;
          case UIDeviceOrientationLandscapeRight:
               realHeading = realHeading - 90.0f;
               break;
          default:
               break;
    }
    while ( realHeading > 360.0f ) {
          realHeading = realHeading - 360;
    }
    return realHeading;
}

抱歉涉及不同语言(Swift - Objective C),为了全面了解问题并找到完整的解决方案,建议阅读以下来源: 希望这有所帮助! 请告诉我。

如果我没记错的话,横屏向左 -> -90.0f,横屏向右 -> +90.0f - vomi

0

在安卓中,我使用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);
}

我希望这对你有用。


0

它们有四种类型,其中一种已被弃用:

  1. public static final int ORIENTATION_UNDEFINED = 0;
  2. public static final int ORIENTATION_PORTRAIT = 1;
  3. public static final int ORIENTATION_LANDSCAPE = 2:
  4. @Deprecated public static final int ORIENTATION_SQUARE = 3;

您可以通过学习来了解更多。

val orientation: Int = resources.configuration.orientation

如果您想学习特定的角度和位置,您应该使用传感器服务,并使用this.sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
对于精确的位置,可以使用以下代码:

sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR)?.let { this.rotationVector = it}

此类还具有不同的功能。
TYPE_ACCELEROMETER

测量应用于设备的加速度力(包括重力)在所有三个物理轴(x、y和z)上的m/s2。

运动检测(摇晃、倾斜等)。

TYPE_GRAVITY

测量应用于所有三个物理轴(x、y、z)上的设备的重力力量,单位为m/s2。

运动检测(摇晃、倾斜等)。

TYPE_GYROSCOPE

测量设备围绕三个物理轴(x、y和z)的每秒弧度旋转速率。

旋转检测(旋转、转动等)。

TYPE_LINEAR_ACCELERATION

测量设备在三个物理轴(x、y和z)上受到的加速度力,单位为m/s2,不包括重力。

监测单一轴向的加速度。

TYPE_ROTATION_VECTOR

通过提供设备旋转向量的三个元素来测量设备的方向。

运动检测和旋转检测。


我在哪里可以获取设备的方向和角度?这根本没有回答问题。 - user426132

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接