MLkit 人脸检测不适用于 android 的前置摄像头

Posted

技术标签:

【中文标题】MLkit 人脸检测不适用于 android 的前置摄像头【英文标题】:MLkit face detection not working with front camera for android 【发布时间】:2020-11-12 23:16:03 【问题描述】:

我正在使用 MLKit 在 android 上进行人脸检测。我正在关注可以在此处找到的官方文档 - https://developers.google.com/ml-kit/vision/face-detection/android。我可以使用后置摄像头成功检测到人脸,但是当我切换到前置摄像头时没有检测到人脸。根据我从this论坛了解到的,问题可能是旋转补偿。为此,我使用了与文档中所示相同的代码-

private static final SparseIntArray ORIENTATIONS = new SparseIntArray();

static 
    ORIENTATIONS.append(Surface.ROTATION_0, 90);
    ORIENTATIONS.append(Surface.ROTATION_90, 0);
    ORIENTATIONS.append(Surface.ROTATION_180, 270);
    ORIENTATIONS.append(Surface.ROTATION_270, 180);


/**
 * Get the angle by which an image must be rotated given the device's current
 * orientation.
 */
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private int getRotationCompensation(String cameraId, Activity activity, Context context)
        throws CameraAccessException 
    // Get the device's current rotation relative to its "native" orientation.
    // Then, from the ORIENTATIONS table, look up the angle the image must be
    // rotated to compensate for the device's rotation.
    int deviceRotation = activity.getWindowManager().getDefaultDisplay().getRotation();
    int rotationCompensation = ORIENTATIONS.get(deviceRotation);

    // On most devices, the sensor orientation is 90 degrees, but for some
    // devices it is 270 degrees. For devices with a sensor orientation of
    // 270, rotate the image an additional 180 ((270 + 270) % 360) degrees.
    CameraManager cameraManager = (CameraManager) context.getSystemService(CAMERA_SERVICE);
    int sensorOrientation = cameraManager
            .getCameraCharacteristics(cameraId)
            .get(CameraCharacteristics.SENSOR_ORIENTATION);
    rotationCompensation = (rotationCompensation + sensorOrientation + 270) % 360;

    return rotationCompensation;

为了改变相机,我只是改变了一个全局变量cameraID,代码中没有做其他的改变。

编辑- 在前置摄像头的情况下,使用旋转 = getRotationCompensation(...) - 180 生成输入图像,如果后置摄像头对我有用,则不减去 180。不知道为什么会这样。我仍然希望对此或如何避免这种情况的任何解释。

【问题讨论】:

您使用的是 CameraX 还是 Camera2? 我正在使用 Camera2 【参考方案1】:

上面代码sn-p的计算可能对前置摄像头效果不好,因为图像翻转。

您能否尝试定义:

static 
  ORIENTATIONS.append(Surface.ROTATION_0, 0);
  ORIENTATIONS.append(Surface.ROTATION_90, 90);
  ORIENTATIONS.append(Surface.ROTATION_180, 180);
  ORIENTATIONS.append(Surface.ROTATION_270, 270);

并使用

if (lensFacing == CameraSelector.LENS_FACING_FRONT) 
  rotationCompensation = (sensorOrientation + rotationDegrees) % 360;
 else  // back-facing
  rotationCompensation = (sensorOrientation - rotationDegrees + 360) % 360;

替换

rotationCompensation = (rotationCompensation + sensorOrientation + 270) % 360;

我们还将更新开发文档中的代码 sn-p 以反映这一点。

【讨论】:

感谢您的回复,它适用于后置摄像头,但不适用于前置摄像头。进行这些更改后减去 180 仍然可以解决问题 仔细检查您重新定义了 ORIENTATIONS 并替换了旋转计算。如果仍然无法使用,能否告诉我您的设备类型? 我交叉检查了,方向,它仍然不起作用。只是为了确保您的回答中的rotationDegrees 是指rotationCompensation 对吗?在名为rotationDegrees 的代码中没有其他变量。我正在使用 Redmi Note 5 进行测试。(Android 8) 是的,它是degreeCompensation。您能否提供deviceRotationsensorOrientationORIENTATIONS.get(deviceRotation) 和最终的degreeCompensation 值?什么时候是纵向模式或横向模式?谢谢!

以上是关于MLkit 人脸检测不适用于 android 的前置摄像头的主要内容,如果未能解决你的问题,请参考以下文章

MLKit 旋转面部图像使其笔直(iOS 和 Android)

需要在使用 MLKit 和 Camera2 进行人脸检测期间捕获静止图像

使用 CameraX 时,前置摄像头的 Facebase MLKit 人脸检测失败

MLKit 是一个强大易用的工具包。通过 ML Kit 您可以很轻松的实现文字识别条码识别图像标记人脸检测对象检测等功能

MLKit 是一个强大易用的工具包。通过 ML Kit 您可以很轻松的实现文字识别条码识别图像标记人脸检测对象检测等功能

Dlib 人脸检测不适用于灰度图像