Flutter自拍人像分割插件google_mlkit_selfie_segmentation的使用
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
更多关于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'),
),
],
),
),
);
}
}
代码解释
-
依赖添加:在
pubspec.yaml
中添加google_mlkit_selfie_segmentation
依赖。 -
UI结构:
- 使用
MaterialApp
和Scaffold
构建基本的UI结构。 SelfieSegmentationScreen
是一个有状态的Widget,用于处理图像选择和分割。
- 使用
-
图像选择:
- 使用
ImagePicker
从相机中选择图像。 - 将选择的图像以字节数组的形式存储在
_imageBytes
变量中。
- 使用
-
图像处理:
- 调用
SelfieSegmentation.processImage
方法对图像进行分割。 - 将分割后的图像以字节数组的形式存储在
_segmentedImageBytes
变量中。
- 调用
-
显示图像:
- 使用
Image.memory
显示原始图像和分割后的图像。 - 使用
ElevatedButton
触发图像选择。
- 使用
这个示例展示了如何使用google_mlkit_selfie_segmentation
插件进行自拍人像分割。你可以根据需要进行进一步的定制和扩展。