Не удается заставить распознавание лиц работать должным образом при использовании Flutter и Firebase_ml_vision

Я боролся с этим около 24 часов и подошел к концу своих идей о том, как с этим справиться.

Я написал код, который загружает изображение из Firebase и обнаруживает на нем лицо - никаких проблем. Но когда я затем смотрю, чтобы сделать снимок, используя стандартный класс imagePicker во Flutter, несмотря на то, что я фактически отображал изображение на экране, чтобы проверить, что это действительный файл, faceDetector не может найти на изображении лица.

Отредактированная версия кода ниже. Не буду компилировать, так как кое-что из моего проекта отсутствует, но, надеюсь, вы поняли идею. Тестовая платформа - iOS (устройство, а не эмулятор). Плагин - firebase_ml_vision 0.9.6+2, а версия flutter - последняя, ​​выпущенная несколько дней назад.

У кого-нибудь есть идеи?


import 'package:flutter/material.dart';
import 'package:firebase_ml_vision/firebase_ml_vision.dart';
import 'package:image_picker/image_picker.dart';
import 'package:modal_progress_hud/modal_progress_hud.dart';
import 'dart:io';
import 'dart:async';
import 'package:camera/camera.dart';

class imageComparison extends StatefulWidget {
  @override
  _imageComparison createState() => _imageComparison();
}

class _imageComparison extends State<imageComparison> {
  CameraController controller;
  List<CameraDescription> cameras;
  File chosenImage;
  bool gotImage = false;
  File grabbedImage;
  FaceDetector faceDetector;
  File tempImg;

  @override
  void initState() {
    super.initState();

    faceDetector = FirebaseVision.instance.faceDetector(FaceDetectorOptions(enableLandmarks: true, enableContours: true, enableClassification: true));

    availableCameras().then((value) {
      cameras = value;
      controller = CameraController(cameras[1], ResolutionPreset.medium);
      controller.initialize().then((_) {
        if (!mounted) {
          return;
        }
        setState(() {});
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    if (controller == null) {
      return Scaffold(
        backgroundColor: Colors.white,
        body: Container(),
      );
    }

    if (!gotImage) {
      File img;
      downloadImage(imageURLs[0], 'verificationImage.jpg').then((value) {
        img = tempImg = value;
        extractFace(img).then((value2) {
          print('got image');
          gotImage = true;
          setState(() {});
        });
      });
    }

    return Scaffold(
      backgroundColor: Colors.white,
      body: ModalProgressHUD(
        inAsyncCall: globals.showSpinner,
        child: Container(
          width: globals.SizeConfig.blockSizeHorizontal * 100,
          height: globals.SizeConfig.blockSizeVertical * 100,
          decoration: BoxDecoration(
            gradient: gradient,
          ),
          child: Stack(
            children: <Widget>[
              Positioned(
                left: globals.SizeConfig.blockSizeHorizontal * 10,
                top: globals.SizeConfig.blockSizeVertical * 5,
                child: Column(
                  children: [
                    FlatButton(
                      child: Text(
                        'check',
                        textAlign: TextAlign.center,
                        style: TextStyle(color: Colors.white, fontSize: globals.SizeConfig.blockSizeHorizontal * 4),
                      ),
                      color: Colors.red,
                      onPressed: () async {
                        bool res = await takeAndAnalyseImage();
                        //other stuff
                      },
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Future<bool> takeAndAnalyseImage() async {
    //String filepath = await takePicture();

    grabbedImage = File((await ImagePicker().getImage(source: ImageSource.camera)).path);

    //grabbedImage = File(filepath);
    setState(() {
      print('setting state');
    });
    while (grabbedImage == null) {}

    if (mounted) {
      extractFace(grabbedImage).then((value) {
        //irrelevant stuff
      });
    }
    return null;
  }

  Future<Map<String, dynamic>> extractFace(File img) async {
    FirebaseVisionImage visionImage;

    visionImage = FirebaseVisionImage.fromFile(img);

    Map<String, dynamic> facevals = Map<String, dynamic>();
    List<Face> faces;
    try {
      faces = await faceDetector.processImage(visionImage);
    } catch (e) {
      print('can\'t extract face from image. e = ' + e.toString());
    }
    for (Face face in faces) {
      //do irrelevant stuff to question.
    }
    return facevals;
  }
}

РЕДАКТИРОВАТЬ: преобразование изображения в 'FirebaseVisionImage' похоже, работает нормально - это FaceDetector.processImage это не удается...

0 ответов

Другие вопросы по тегам