Flutter自拍人像分割插件google_mlkit_selfie_segmentation的使用

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

Flutter自拍人像分割插件google_mlkit_selfie_segmentation的使用

简介

Google’s ML Kit Selfie Segmentation for Flutter 插件允许开发者轻松地将背景从场景中的用户分离出来,专注于重要的部分。该插件通过Flutter平台通道与Google原生API进行交互,以实现机器学习处理。

注意事项

在继续或发布新问题之前,请务必阅读以下内容:

  • Google’s ML Kit 仅适用于移动平台:iOS和Android应用。Web或其他平台不受支持。
  • 此插件不是由Google赞助或维护的。作者是热衷于机器学习的开发者,他们希望将Google的原生API暴露给Flutter。
  • Google的ML Kit API仅针对iOS和Android原生开发。此插件使用Flutter平台通道,所有调用都通过MethodChannel(Android)和FlutterMethodChannel(iOS)传递给原生平台,并使用Google的原生API执行。
  • 使用平台通道时,可能会遇到原生API的问题。请确保在提交新问题之前,先检查Google的示例应用是否能复现问题。

要求

iOS

  • 最低iOS部署目标:15.5.0
  • Xcode 15.3.0或更新版本
  • Swift 5
  • ML Kit不支持32位架构(i386和armv7),仅支持64位架构(x86_64和arm64)。需要在Xcode中排除armv7架构。
  • Podfile配置如下:
platform :ios, '15.5.0'  # 或更新版本

...

$iOSVersion = '15.5.0'  # 或更新版本

post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=*]"] = "armv7"
    config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion
  end

  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)

    target.build_configurations.each do |config|
      if Gem::Version.new($iOSVersion) > Gem::Version.new(config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'])
        config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion
      end
    end
  end
end

Android

  • minSdkVersion: 21
  • targetSdkVersion: 33
  • compileSdkVersion: 34

使用方法

创建InputImage实例

根据官方文档创建InputImage实例。

final InputImage inputImage;

创建SelfieSegmenter实例

final segmenter = SelfieSegmenter(
  mode: SegmenterMode.stream,
  enableRawSizeMask: true,
);

处理图像

final mask = await segmenter.processImage(inputImage);

释放资源

segmenter.close();

示例应用

可以在这里找到完整的示例应用。

完整示例代码

下面是一个完整的示例代码,展示了如何使用google_mlkit_selfie_segmentation插件来处理图像并获取分割掩码。

import 'package:flutter/material.dart';
import 'package:google_mlkit_selfie_segmentation/google_mlkit_selfie_segmentation.dart';
import 'package:image_picker/image_picker.dart';

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

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

class SelfieSegmentationDemo extends StatefulWidget {
  @override
  _SelfieSegmentationDemoState createState() => _SelfieSegmentationDemoState();
}

class _SelfieSegmentationDemoState extends State<SelfieSegmentationDemo> {
  final SelfieSegmenter _segmenter = SelfieSegmenter(
    mode: SegmenterMode.single,
    enableRawSizeMask: true,
  );

  ImagePicker _picker = ImagePicker();
  XFile? _pickedFile;
  bool _isBusy = false;

  Future<void> _processImage(XFile imageFile) async {
    setState(() {
      _isBusy = true;
    });

    final inputImage = InputImage.fromFilePath(imageFile.path);
    final mask = await _segmenter.processImage(inputImage);

    // 这里可以处理分割后的mask,例如将其显示在屏幕上
    print('Processed mask');

    setState(() {
      _isBusy = false;
    });
  }

  @override
  void dispose() {
    _segmenter.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Selfie Segmentation Demo'),
      ),
      body: Column(
        children: [
          ElevatedButton(
            onPressed: () async {
              _pickedFile = await _picker.pickImage(source: ImageSource.gallery);
              if (_pickedFile != null) {
                await _processImage(_pickedFile!);
              }
            },
            child: Text('Pick Image from Gallery'),
          ),
          if (_pickedFile != null)
            Image.file(File(_pickedFile!.path)),
          if (_isBusy) CircularProgressIndicator(),
        ],
      ),
    );
  }
}

这个示例代码展示了如何使用google_mlkit_selfie_segmentation插件来处理从相册选择的图像,并获取分割掩码。您可以根据需要进一步扩展和优化此代码。


更多关于Flutter自拍人像分割插件google_mlkit_selfie_segmentation的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自拍人像分割插件google_mlkit_selfie_segmentation的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用google_mlkit_selfie_segmentation插件进行自拍人像分割的示例代码。这个插件允许你使用Google ML Kit的人像分割功能来分割图像中的人像和背景。

首先,确保你已经在pubspec.yaml文件中添加了google_mlkit_selfie_segmentation依赖:

dependencies:
  flutter:
    sdk: flutter
  google_mlkit_selfie_segmentation: ^latest_version  # 使用最新版本

然后运行flutter pub get来安装依赖。

接下来,创建一个Flutter应用,并在其中使用google_mlkit_selfie_segmentation插件。以下是一个简单的示例代码:

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

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

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

class SelfieSegmentationScreen extends StatefulWidget {
  @override
  _SelfieSegmentationScreenState createState() => _SelfieSegmentationScreenState();
}

class _SelfieSegmentationScreenState extends State<SelfieSegmentationScreen> {
  final _picker = ImagePicker();
  Uint8List? _imageBytes;
  Uint8List? _segmentedImageBytes;

  Future<void> _pickImage() async {
    final pickedFile = await _picker.pickImage(source: ImageSource.camera);
    if (pickedFile != null) {
      setState(() {
        _imageBytes = pickedFile.readAsBytesSync();
      });
      _processImage();
    }
  }

  Future<void> _processImage() async {
    if (_imageBytes == null) return;

    final result = await SelfieSegmentation.processImage(_imageBytes!);
    if (result != null && result.segmentedImage != null) {
      setState(() {
        _segmentedImageBytes = result.segmentedImage!;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Selfie Segmentation Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            _imageBytes != null
                ? Image.memory(_imageBytes!)
                : Text('No image selected'),
            SizedBox(height: 20),
            _segmentedImageBytes != null
                ? Image.memory(_segmentedImageBytes!)
                : Container(),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _pickImage,
              child: Text('Capture Image'),
            ),
          ],
        ),
      ),
    );
  }
}

代码解释

  1. 依赖添加:在pubspec.yaml中添加google_mlkit_selfie_segmentation依赖。

  2. UI结构

    • 使用MaterialAppScaffold构建基本的UI结构。
    • SelfieSegmentationScreen是一个有状态的Widget,用于处理图像选择和分割。
  3. 图像选择

    • 使用ImagePicker从相机中选择图像。
    • 将选择的图像以字节数组的形式存储在_imageBytes变量中。
  4. 图像处理

    • 调用SelfieSegmentation.processImage方法对图像进行分割。
    • 将分割后的图像以字节数组的形式存储在_segmentedImageBytes变量中。
  5. 显示图像

    • 使用Image.memory显示原始图像和分割后的图像。
    • 使用ElevatedButton触发图像选择。

这个示例展示了如何使用google_mlkit_selfie_segmentation插件进行自拍人像分割。你可以根据需要进行进一步的定制和扩展。

回到顶部