Компьютерное зрение с ML Kit - флаттер в фокусе - PullRequest
2 голосов
/ 10 апреля 2019

Я пытаюсь следовать учебному пособию Computer Vision с комплектом ML - Flutter In Focus , в котором я следовал учебному пособию шаг за шагом, но мне все равно не удалось заставить его работать.

мой код выглядит следующим образом:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: FacePage(),
    );
  }
}


class FacePage extends StatefulWidget{
  @override
  createState() => _FacePageState();
}

class _FacePageState extends State<FacePage>{
  File _imageFile;
  List<Face> _faces;


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Face Detector'),
      ),

      body: ImageAndFaces(),

      floatingActionButton: FloatingActionButton(
        onPressed: _getImageAndDetectFace,
        tooltip: 'Pick an Image',
        child: Icon(Icons.add_a_photo),
      ),
    );
  }

  void _getImageAndDetectFace() async {
    final imageFile = await ImagePicker.pickImage(
        source: ImageSource.gallery,
    );

    final image = FirebaseVisionImage.fromFile(imageFile);

    final faceDetector = FirebaseVision.instance.faceDetector(
      FaceDetectorOptions(
        mode: FaceDetectorMode.accurate,
        enableLandmarks: true,
      ),
    );
    List<Face> faces = await faceDetector.detectInImage(image);

    if(mounted) {
      setState(() {
        _imageFile = imageFile;
        _faces = faces;
      });
    }
  }
}

class ImageAndFaces extends StatelessWidget {
  ImageAndFaces({this.imageFile, this.faces});
  final File imageFile;
  final List<Face> faces;

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Flexible(
          flex: 2 ,
          child: Container(
            constraints: BoxConstraints.expand(),
            child: Image.file(imageFile, fit: BoxFit.cover),
            ),
        ),
        Flexible(flex: 1 ,
            child: ListView(
              children: faces.map<Widget>((f) => FaceCoordinates(f)).toList(),
            ),
        ),
      ],
    );
  }
}

class FaceCoordinates extends StatelessWidget {
  FaceCoordinates(this.face);
  final Face face;

  @override
  Widget build(BuildContext context) {
    final pos = face.boundingBox;
    return ListTile(
      title: Text('(${pos.top}, ${pos.left}, ${pos.bottom}, ${pos.right})'),
    );
  }
}

Я получаю следующий стек исключений:

I/flutter ( 5077): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter ( 5077): The following assertion was thrown building ImageAndFaces(dirty):
I/flutter ( 5077): 'package:flutter/src/painting/image_provider.dart': Failed assertion: line 532 pos 14: 'file !=
I/flutter ( 5077): null': is not true.
I/flutter ( 5077): 
I/flutter ( 5077): Either the assertion indicates an error in the framework itself, or we should provide substantially
I/flutter ( 5077): more information in this error message to help you determine and fix the underlying cause.
I/flutter ( 5077): In either case, please report this assertion by filing a bug on GitHub:
I/flutter ( 5077):   https://github.com/flutter/flutter/issues/new?template=BUG.md
I/flutter ( 5077): 
I/flutter ( 5077): When the exception was thrown, this was the stack:
I/flutter ( 5077): #2      new FileImage (package:flutter/src/painting/image_provider.dart:532:14)
I/flutter ( 5077): #3      new Image.file (package:flutter/src/widgets/image.dart:254:16)
I/flutter ( 5077): #4      ImageAndFaces.build (package:visionappwork/main.dart:94:28)
I/flutter ( 5077): #5      StatelessElement.build (package:flutter/src/widgets/framework.dart:3789:28)
I/flutter ( 5077): #6      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3736:15)
.........

Кто-нибудь знает, в чем проблема? Я пробовал все, что мог придумать, включая попытки поймать конструктор класса 'ImageAndFaces', когда он создает экземпляр, но безуспешно. Я новичок в трепетании и дротике, так что, возможно, это глупая ошибка.

Большое спасибо!

1 Ответ

2 голосов
/ 10 апреля 2019

Причиной возникновения проблемы является то, что imageFile начинается с нуля. Поскольку он передается в Image.file(imageFile, fit: BoxFit.cover), вы видите сбой из-за утверждения, что файл, переданный в Image.file, не равен нулю.

Вам нужно добавить логику, чтобы проверить, является ли imageFile нулевым, и сделать что-то другое, если оно есть.

...