Android Face Detection не находит лица - PullRequest
0 голосов
/ 24 сентября 2018

Я хочу найти лицо на изображении с камеры.Но детектор не может найти лица.Мое приложение делает фото и сохраняет его в файл.

Ниже приведен код, который создает файл, запускает камеру и в 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 голосов
/ 24 сентября 2018

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);
                    }
            }
    }
0 голосов
/ 24 сентября 2018

Android API обнаружения лица отслеживает лицо на фотографиях, в видео, используя такие ориентиры, как глаза, нос, уши, щеки и рот.Вместо того, чтобы обнаруживать отдельные особенности, API обнаруживает лицо сразу, а затем, если он определен, обнаруживает ориентиры и классификации.Кроме того, API также может обнаруживать лица под разными углами.

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

...