2

我正在使用移动视觉 API 来检测 android 应用程序中的人脸。

我使用 SparseArray of Face 来存储对人脸的引用,但是检测器.detect(frame) 方法需要很长时间(15 秒)才能检测到人脸。

注意:我将相机拍摄的图像的位图传递给 detectFaces 方法。

我的代码如下

void detectFaces(Context context, Bitmap picture){
    com.google.android.gms.vision.face.FaceDetector detector = new com.google.android.gms.vision.face.FaceDetector.Builder(context)
            .setTrackingEnabled(false)
            .setClassificationType(com.google.android.gms.vision.face.FaceDetector.ALL_CLASSIFICATIONS)
            .build();

    //Build the frame
    Frame frame = new Frame.Builder().setBitmap(picture).build();

    //Detect the faces
    SparseArray<Face> faces = detector.detect(frame);//**This takes approx 15 second**
    if(faces.size() == 0)
        Toast.makeText(context, "No Face Detected", Toast.LENGTH_SHORT).show();
    else
    {
        Toast.makeText(context,"Face detected are : " + faces.size() , Toast.LENGTH_LONG).show();
        getClassification(faces.valueAt(0));
    }

    //Release the detector
    detector.release();
}
4

1 回答 1

-1

我目前正在浏览此示例应用程序,并且遇到了相同的问题,即应用程序不断返回未检测到人脸。

在阅读了此处找到的文档后,我看到我应该使用 检测器.isOperational()来测试是否已下载所需的文件以便检测工作。我使用这种方法来建议文件正在像这样下载:

public static void detectFaces(Context context, Bitmap image){
        // Create the face detector, disable tracking and enable classifications

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

        if(detector.isOperational()){
            // Build the frame
            Frame frame = new Frame.Builder().setBitmap(image).build();
            ...
        }else{
            Toast.makeText(context, R.string.not_operational, Toast.LENGTH_LONG).show();
        }


    }

接下来我意识到探测器从未运行过。经过更多研究,我发现问题在于我的设备没有足够的存储空间来保存所需的其他文件。我切换到另一台设备在第一次尝试时出现“不可操作”错误,从那时起它一直在工作。

此外,释放一些空间并将应用程序移动到外部存储允许它在我的第一台设备上运行。

于 2017-05-24T17:09:56.420 回答