android mobile vision api自定义检测器未检测到人脸

Posted

技术标签:

【中文标题】android mobile vision api自定义检测器未检测到人脸【英文标题】:android mobile vision api custom detector not detecting face 【发布时间】:2017-08-30 14:29:30 【问题描述】:

我正在探索 android vision api 并遵循 android 开发人员文档中提供的 github 示例。示例应用程序正在检测人脸。

我想裁剪检测到的每个人脸。 我有一个 rect obj 具有左、上、右、下坐标。

但我缺少用于裁剪面部的源位图。

我做过的事情

1.尝试使用SOF post中给出的自定义检测器

这里 myFaceDetector 的 SparseArray detect(Frame frame) 方法被重复调用,它没有检测到人脸。处理器集没有被调用。 我使用了下面的代码

    FaceDetector detector = new FaceDetector.Builder(context)
            .setClassificationType(FaceDetector.ALL_CLASSIFICATIONS)
            .build();

    MyFaceDetector myFaceDetector = new MyFaceDetector(detector);

    myFaceDetector.setProcessor(new MultiProcessor.Builder<>(new GraphicFaceTrackerFactory())
    .build());

    mCameraSource = new CameraSource.Builder(context, myFaceDetector)
            .setRequestedPreviewSize(640, 480)
            .setFacing(CameraSource.CAMERA_FACING_FRONT)
            .setRequestedFps(2.0f)
            .build();

在相机预览开始后没有调用 GraphicFaceTrackerFactory()。

2.尝试将相机图片作为源位图,但连续拍照。

任何帮助都会非常有用。在此先感谢。

【问题讨论】:

【参考方案1】:

我想裁剪每个检测到的人脸。我有一个具有左、上、右、下坐标的矩形 obj。

一旦检测到人脸,您可以通过 Face.getPosition() 、 Face.getHeight() 和 Face.getWidth() 获取人脸的位置和尺寸

这里 myFaceDetector 的 SparseArray detect(Frame frame) 方法被重复调用,它没有检测到人脸

您是否尝试过设置正确的方向?在 Frame.Builder 中,添加 setRotation(ROT),其中 ROT 是具有以下任何值的 int:0、1、2 或 3(分别表示 0、90、180 和 270 度)。在您引用的答案中提到了这一点:)

但我缺少用于裁剪面部的源位图。

可以像这样从当前帧生成位图

Bitmap frameToBitmap(Frame currentFrame)
    ByteBuffer buffer = currentFrame.getGrayscaleImageData(); // getBitmap only works when the frame was created using Bitmap
    byte[] bytes = new byte[buffer.capacity()];
    buffer.get(bytes);
    int[] pixels = applyGrayScale(new int[bytes.length], bytes, img.getWidth(),img.getHeight());
    return Bitmap.createBitmap(pixels, img.getWidth(), img.getHeight(), Bitmap.Config.ARGB_8888);


static int[] applyGrayScale(int[] pixels, byte[] data, int width, int height)  //from another SOF answer...
    int p;
    int size = width*height;
    for(int i = 0; i < size; i++) 
        p = data[i] & 0xFF;
        pixels[i] = 0xff000000 | p<<16 | p<<8 | p;
    
    return pixels;


附带说明,CamerSource 类有可用的代码,尽管在邻居示例中:BarCode Reader

【讨论】:

以上是关于android mobile vision api自定义检测器未检测到人脸的主要内容,如果未能解决你的问题,请参考以下文章

Mobile Vision API 检测不到二维码

如何强制 Android 版 Mobile Vision 读取整行文本

java Mobile Vision API修复了缺少自动对焦功能的问题

无法使用 Mobile Vision API 从图像中读取文本

是否需要图像预处理(Google Mobile Vision Text Recognition API)?

Java - 带有轮廓的 Android Mobile Vision 人脸检测