【问题标题】:Detect face and crop face image flutter firebase ml检测人脸并裁剪人脸图像flutter firebase ml
【发布时间】:2020-08-18 12:23:07
【问题描述】:

在这里我需要裁剪检测到的人脸并保存为图像/文件。 我能够用圆角矩形检测人脸。如何裁剪检测到的人脸区域? 我正在使用 flutter_firebase_ml_kit 来检测人脸。 这是我的代码:

getImageAndDetectFaces() async {
    setState(() {
      isLoading = true;
    });
    final image = FirebaseVisionImage.fromFile(widget.cardImage);
    final faceDetector = FirebaseVision.instance.faceDetector(
        FaceDetectorOptions(
            mode: FaceDetectorMode.fast,
            enableLandmarks: true
        )
    );
    List<Face> faces = await faceDetector.processImage(image);
    if (mounted) {
      setState(() {
        _faces = faces;
        _loadImage(widget.cardImage);
      });
    }
  }

  _loadImage(File file) async {
    final data = await file.readAsBytes();
    await decodeImageFromList(data).then(
          (value) => setState(() {
        img = value;
        isLoading = false;
      }),
    );
  }


class FacePainter extends CustomPainter {
  final ui.Image image;
  final List<Face> faces;
  final List<Rect> rects = [];


  FacePainter(this.image, this.faces) {
    for (var i = 0; i < faces.length; i++) {
      rects.add(faces[i].boundingBox);
    }
  }

  @override
  void paint(ui.Canvas canvas, ui.Size size) {
    final Paint paint = Paint()
      ..style = PaintingStyle.stroke
      ..strokeWidth = 15.0
      ..color = Colors.blue;

    canvas.drawImage(image, Offset.zero, Paint());
    for (var i = 0; i < faces.length; i++) {
      canvas.drawRect(rects[i], paint);
    }
  }


  @override
  bool shouldRepaint(FacePainter oldDelegate) {
    return image != oldDelegate.image || faces != oldDelegate.faces;
  }

}

需要解决如何裁剪检测到的面部区域。 提前致谢。

【问题讨论】:

  • 您必须使用 tensorflow 或一些 AI 模型来检测人脸及其边缘。
  • 使用 firebase ml

标签: firebase flutter firebase-mlkit


【解决方案1】:

使用List&lt;Face&gt; faces = await faceDetector.processImage(image); 运行 faceDetector 后,您需要从每个检测到的人脸中提取信息。由于我们只对边界框感兴趣,因此您可以使用以下内容:

List<Map<String, int>> faceMaps = [];
for (Face face in faces) {
      int x = face.boundingBox.left.toInt();
      int y = face.boundingBox.top.toInt();
      int w = face.boundingBox.width.toInt();
      int h = face.boundingBox.height.toInt();
      Map<String, int> thisMap = {'x': x, 'y': y, 'w': w, 'h':h};
      faceMaps.add(thisMap);
    }

上面将创建一个Map&lt;String, int&gt; 列表,然后填充每个检测到的人脸的边界框信息。

然后您可以使用Image packagecopyCrop 函数从边界框中提取人脸

// add dart package as
import 'package:image/image.dart' as img;
// create an img.Image from your original image file for processing
img.Image originalImage = img.decodeImage(File(_imageFile.path).readAsBytesSync());
// now crop out only the detected face boundry, below will crop out the first face from the list
img.Image faceCrop = img.copyCrop(originalImage, faceMaps[0]['x'], faceMaps[0]['y'], faceMaps[0]['w'], faceMaps[0]['h']);

【讨论】:

  • 您好,我按照您在 Google ML Kit 上的建议流式传输帧和裁剪人脸。相机和 GoogleMLKit 工作得很好,但我无法从 InputImage.bytes Uint8List 重建 originalImage。你有什么建议吗?谢谢
【解决方案2】:

一旦你有了边界框,你应该可以用它裁剪人脸。不熟悉flutter,但是这里有一些关于使用Dart进行图像裁剪的讨论:How do I crop an image in Flutter?

【讨论】:

    猜你喜欢
    • 2011-11-14
    • 1970-01-01
    • 2012-10-25
    • 2016-07-03
    • 2016-01-01
    • 2018-03-07
    • 2022-11-24
    • 2014-04-28
    • 2015-03-11
    相关资源
    最近更新 更多