Android人脸检测找不到人脸

时间:2018-09-24 08:56:16

标签: java android kotlin face-detection

我想在相机的图像上找到人脸。但是检测器找不到脸。我的应用程序会拍照并保存在文件中。

下面的代码创建文件,启动相机,并在onActivityResult中尝试检测人脸并将文件路径保存到房间,正确保存并在回收站视图中按预期显示,但是人脸检测器未找到人脸。我该如何解决?

    private fun takePhoto() {
    val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    if (takePictureIntent.resolveActivity(activity?.packageManager!!) != null) {
        val photoFile: File
        try {
            photoFile = createImageFile()
        } catch (e: IOException) {
            error { e }
        }
        val photoURI = FileProvider.getUriForFile(activity?.applicationContext!!, "com.nasibov.fakhri.neurelia.fileprovider", photoFile)
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
        takePictureIntent.putExtra("android.intent.extras.CAMERA_FACING", 1)

        startActivityForResult(takePictureIntent, PhotoFragment.REQUEST_TAKE_PHOTO)
    }
}

@Suppress("SimpleDateFormat")
private fun createImageFile(): File {
    val date = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
    val fileName = "JPEG_$date"
    val filesDir = activity?.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
    val image = File.createTempFile(fileName, ".jpg", filesDir)
    mCurrentImage = image
    return mCurrentImage
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (requestCode == REQUEST_TAKE_PHOTO && resultCode == Activity.RESULT_OK) {


        val bitmap = BitmapFactory.decodeFile(mCurrentImage.absolutePath)

        val frame = Frame.Builder().setBitmap(bitmap).build()

        val detectedFaces = mFaceDetector.detect(frame)

        mViewModel.savePhoto(mCurrentImage)
    }
}

2 个答案:

答案 0 :(得分:0)

Android人脸检测API使用眼睛,鼻子,耳朵,脸颊和嘴巴等地标来跟踪照片,视频中的人脸。 API不会立即检测到个人特征,而是立即检测到人脸,然后在定义后检测界标和分类。此外,API还可以检测各种角度的面部。

https://www.journaldev.com/15629/android-face-detection

答案 1 :(得分:0)

Android SDK包含用于人脸检测的API:android.media.FaceDetector类。此类检测图像上的脸部。要检测脸部,请调用findFaces类的FaceDetector方法。 findFaces方法返回多个检测到的面部并填充FaceDetector.Faces[]数组。请注意,findFaces方法目前仅支持RGB_565格式的位图。

FaceDetector.Face类的每个实例都包含以下信息:

  • 确信它实际上是一张脸–介于0和1之间的浮点值。
  • 两眼之间的距离-以像素为单位。
  • 两眼之间的中点位置(x,y)。
  • 旋转(X,Y,Z)。

不幸的是,它不包含包含检测到的面部的框架矩形。

这是用于面部检测的示例源代码。此示例代码可启用自定义视图,该视图显示SD卡中保存的图像,并在检测到的脸上绘制透明的红色圆圈。

class Face_Detection_View extends View {
            private static final int MAX_FACES = 10;
            private static final String IMAGE_FN = "face.jpg";
            private Bitmap background_image;
            private FaceDetector.Face[] faces;
            private int face_count;

            // preallocate for onDraw(...)
            private PointF tmp_point = new PointF();
            private Paint tmp_paint = new Paint();

            public Face_Detection_View(Context context) {
                    super(context);

                    // Load an image from SD Card
                    updateImage(Environment.getExternalStorageDirectory() + "/" + IMAGE_FN);
            }

            public void updateImage(String image_fn) {
                    // Set internal configuration to RGB_565
                    BitmapFactory.Options bitmap_options = new BitmapFactory.Options();
                    bitmap_options.inPreferredConfig = Bitmap.Config.RGB_565;
                    background_image = BitmapFactory.decodeFile(image_fn, bitmap_options);
                    FaceDetector face_detector = new FaceDetector(
                                    background_image.getWidth(),                                    background_image.getHeight(),

                                    MAX_FACES);

                    faces = new FaceDetector.Face[MAX_FACES];
                    // The bitmap must be in 565 format (for now).
                    face_count = face_detector.findFaces(background_image, faces);
                    Log.d("Face_Detection", "Face Count: " + String.valueOf(face_count));
            }

            public void onDraw(Canvas canvas) {
                    canvas.drawBitmap(background_image, 0, 0, null);
                    for (int i = 0; i < face_count; i++) {
                            FaceDetector.Face face = faces[i];
                            tmp_paint.setColor(Color.RED);
                            tmp_paint.setAlpha(100);
                            face.getMidPoint(tmp_point);
                            canvas.drawCircle(tmp_point.x, tmp_point.y, face.eyesDistance(),
                                            tmp_paint);
                    }
            }
    }