带有ML套件的计算机视觉-扑朔迷离

时间:2019-04-10 19:16:47

标签: dart flutter firebase-mlkit

我正在尝试遵循Computer Vision with ML Kit - 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 个答案:

答案 0 :(得分:2)

您遇到问题的原因是imageFile开始为null。由于将其传递给Image.file(imageFile, fit: BoxFit.cover),因此您会看到失败,原因是断言传递给Image.file的文件不为空。

您需要添加一些逻辑以检查imageFile是否为null,如果存在,请执行其他操作。