Flutter人脸检测插件google_mediapipe_face_detection的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter人脸检测插件google_mediapipe_face_detection的使用

获取开始

这个项目是一个基于Google的MediaPipe脸部识别库的Flutter插件。MediaPipe是一个专门用于Web的平台特定实现代码的库。

如果你需要帮助,请查看示例项目。完整的API文档很快就会发布。如有任何问题,请联系作者:mr.khushalrao@gmail.com

安装

在你的pubspec.yaml文件中添加以下依赖:

flutter pub add google_mediapipe_face_detection

使用

首先,我们需要初始化插件并加载模型。接下来,我们可以使用相机捕获图像,并通过插件处理该图像以检测面部。

import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:google_mediapipe_face_detection/google_mediapipe_face_detection.dart';
import 'package:google_mlkit_commons/google_mlkit_commons.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    super.initState();
    initCamera();
  }

  List<CameraDescription>? cameras;
  CameraController? cameraController;
  GoogleMediapipeFaceDetection? faceDetection;

  Future<void> initCamera() async {
    try {
      faceDetection = GoogleMediapipeFaceDetection();
      await faceDetection?.load();
      cameras = await availableCameras();
      if (cameras?.isEmpty ?? true) {
        throw 'Camera Empty';
      }
      cameraController = CameraController(
        cameras![0],
        ResolutionPreset.medium,
      );
      await cameraController?.initialize();
      setState(() {});
    } catch (e) {
      debugPrint(e.toString());
    }
  }

  InputImage? cameraImageToInputImage(CameraImage image) {
    try {
      final WriteBuffer allBytes = WriteBuffer();
      for (final Plane plane in image.planes) {
        allBytes.putUint8List(plane.bytes);
      }
      final bytes = allBytes.done().buffer.asUint8List();

      InputImage inputImage = InputImage.fromBytes(
        bytes: bytes,
        metadata: InputImageMetadata(
          size: Size(image.width.toDouble(), image.height.toDouble()),
          rotation: InputImageRotation.rotation0deg,
          format: InputImageFormatValue.fromRawValue(image.format.raw) ??
              InputImageFormat.yuv_420_888,
          bytesPerRow: bytes.buffer.lengthInBytes,
        ),
      );
      return inputImage;
    } catch (e) {
      return null;
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('人脸检测示例应用'),
        ),
        body: Center(
          child: (cameraController != null &&
                  (cameraController?.value.isInitialized ?? false))
              ? CameraPreview(
                  cameraController!,
                )
              : const Text('正在加载相机...'),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () async {
            try {
              final capturedImage = await cameraController?.takePicture();
              if (capturedImage == null) {
                throw 'Empty Camera Image';
              }
              InputImage inputImage =
                  InputImage.fromFilePath(capturedImage.path);
              final res = await faceDetection?.processImage(inputImage);
              debugPrint(res.toString());
            } catch (e) {
              debugPrint(e.toString());
              return;
            }
          },
          child: const Icon(Icons.face),
        ),
      ),
    );
  }
}

更多关于Flutter人脸检测插件google_mediapipe_face_detection的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter人脸检测插件google_mediapipe_face_detection的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 google_mediapipe_face_detection 插件在 Flutter 应用中实现人脸检测的示例代码。这个插件基于 Google MediaPipe,提供了高效且准确的人脸检测功能。

首先,确保你已经在 Flutter 项目的 pubspec.yaml 文件中添加了 google_mediapipe_face_detection 依赖:

dependencies:
  flutter:
    sdk: flutter
  google_mediapipe_face_detection: ^latest_version  # 请替换为最新的版本号

然后,运行 flutter pub get 来获取依赖。

接下来,在你的 Flutter 应用中实现人脸检测。以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:google_mediapipe_face_detection/google_mediapipe_face_detection.dart';
import 'dart:typed_data';
import 'dart:ui' as ui;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FaceDetectionScreen(),
    );
  }
}

class FaceDetectionScreen extends StatefulWidget {
  @override
  _FaceDetectionScreenState createState() => _FaceDetectionScreenState();
}

class _FaceDetectionScreenState extends State<FaceDetectionScreen> {
  late FaceDetectionController _faceDetectionController;
  late CameraController _cameraController;
  bool _isDetecting = false;

  @override
  void initState() {
    super.initState();
    _initializeCamera();
    _initializeFaceDetection();
  }

  @override
  void dispose() {
    _faceDetectionController.dispose();
    _cameraController.dispose();
    super.dispose();
  }

  Future<void> _initializeCamera() async {
    _cameraController = CameraController(
      CameraDescription(lensDirection: CameraLensDirection.front),
      ResolutionPreset.medium,
    );

    _cameraController.initialize().then((_) {
      if (!mounted) return;
      setState(() {});
    });
  }

  Future<void> _initializeFaceDetection() async {
    _faceDetectionController = FaceDetectionController(
      options: FaceDetectionOptions(
        runtimeOptions: RuntimeOptions(
          maxNumFaces: 1,
          minDetectionConfidence: 0.5,
          minTrackingConfidence: 0.5,
        ),
      ),
    );

    _faceDetectionController.initialize().then((_) {
      setState(() {
        _isDetecting = true;
      });
    });

    _faceDetectionController.setCameraImageStream(_cameraController.value.previewSize, (CameraImage cameraImage) async {
      final planes = cameraImage.planes;
      final RawImagePlane plane = planes.mapAt(0);
      final Uint8List bytes = plane.bytes;
      final int width = plane.bytesPerRow;
      final int height = plane.height;
      final int rowStride = plane.rowStride;
      final int pixelStride = plane.pixelStride;

      final image = ui.Image.fromBytes(
        width,
        height,
        planes.first.bytes,
        rowStride,
        pixelStride,
      );

      final byteData = await image.toByteData(format: ui.ImageByteFormat.rawRgba);
      final Uint8List rgbaBytes = byteData!.buffer.asUint8List();

      final result = await _faceDetectionController.processImage(rgbaBytes, width, height);
      print(result);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Face Detection'),
      ),
      body: _cameraController.value.isInitialized
          ? Center(
              child: AspectRatio(
                aspectRatio: _cameraController.value.aspectRatio,
                child: CameraPreview(_cameraController),
              ),
            )
          : Container(),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          if (!_isDetecting) return;
          await _cameraController.startImageStream((CameraImage image) async {
            // This stream is already handled by _faceDetectionController.setCameraImageStream
          });
        },
        tooltip: 'Start Detection',
        child: Icon(Icons.play_arrow),
      ),
    );
  }
}

代码说明:

  1. 依赖导入:在 pubspec.yaml 中添加 google_mediapipe_face_detection 依赖。
  2. 相机初始化:使用 CameraController 初始化相机。
  3. 人脸检测初始化:使用 FaceDetectionController 初始化人脸检测,并设置检测选项。
  4. 图像流处理:将相机的图像流传递给 FaceDetectionController 进行处理,并在处理结果中输出检测到的人脸信息。
  5. UI布局:使用 CameraPreview 显示相机预览,并使用 FloatingActionButton 控制人脸检测的启动。

注意:

  • 确保你的设备具有相机权限。
  • 在实际应用中,你可能需要处理更多的错误情况,例如相机初始化失败或人脸检测初始化失败。
  • 由于插件可能会更新,请参考最新的文档和示例代码以确保兼容性。

这个示例展示了如何使用 google_mediapipe_face_detection 插件在 Flutter 应用中实现基本的人脸检测功能。你可以根据需要进行扩展和定制。

回到顶部