Flutter深度图像获取插件apple_vision_image_depth的使用
Flutter深度图像获取插件apple_vision_image_depth的使用
apple_vision_image_depth
Apple Vision Depth Detection 是一个 Flutter 插件,使 Flutter 应用能够使用 Apple Vision Image Depth。
- 该插件并非由 Apple 赞助或维护。作者是一些希望为 macOS 创建类似 Google ML Kit 的开发者。
Requirements(需求)
MacOS
- 最低 osx 部署目标: 10.13
- Xcode 13 或更新版本
- Swift 5
- ML Kit 仅支持 64 位架构 (x86_64 和 arm64)。
iOS
- 最低 ios 部署目标: 14.0
- Xcode 13 或更新版本
- Swift 5
- ML Kit 仅支持 64 位架构 (x86_64 和 arm64)。
Getting Started(开始使用)
首先,需要导入 ‘package:apple_vision/apple_vision.dart’;
final GlobalKey cameraKey = GlobalKey(debugLabel: "cameraKey");
AppleVisionImageDepthController visionController = AppleVisionImageDepthController();
InsertCamera camera = InsertCamera();
Size imageSize = const Size(640,640*9/16);
String? deviceId;
bool loading = true;
Uint8List? image;
late double deviceWidth;
late double deviceHeight;
int intr = 0;
[@override](/user/override)
void initState() {
camera.setupCameras().then((value){
setState(() {
loading = false;
});
camera.startLiveFeed((InputImage i){
if(i.metadata?.size != null){
imageSize = i.metadata!.size;
}
if(mounted) {
Uint8List? image = i.bytes;
visionController.processImage(ImageDepthData(image:image!, imageSize: imageSize)).then((data){
this.image = data;
if(intr == 0){
intr++;
}
setState(() {
});
});
}
});
});
super.initState();
}
[@override](/user/override)
void dispose() {
camera.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
deviceWidth = MediaQuery.of(context).size.width;
deviceHeight = MediaQuery.of(context).size.height;
return ListView(
children:<Widget>[
SizedBox(
width: 320,
height: 320*9/16,
child: loading?Container():CameraSetup(camera: camera, size: imageSize)
),
if(image != null) SizedBox(
width: 320,
height: 320*9/16,
child: Image.memory(
image!,
fit: BoxFit.fitHeight,
)
)
]
);
}
Widget loadingWidget(){
return Container(
width: deviceWidth,
height:deviceHeight,
color: Theme.of(context).canvasColor,
alignment: Alignment.center,
child: const CircularProgressIndicator(color: Colors.blue)
);
}
Example(示例)
以下是完整的示例代码:
import 'package:apple_vision_image_depth/apple_vision_image_depth.dart';
import 'package:flutter/material.dart';
import '../camera/camera_insert.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'camera/input_image.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// 这个小部件是您的应用的根。
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const VisionDepth(),
);
}
}
class VisionDepth extends StatefulWidget {
const VisionDepth({
Key? key,
this.onScanned
}):super(key: key);
final Function(dynamic data)? onScanned;
[@override](/user/override)
_VisionDepth createState() => _VisionDepth();
}
class _VisionDepth extends State<VisionDepth>{
final GlobalKey cameraKey = GlobalKey(debugLabel: "cameraKey");
AppleVisionImageDepthController visionController = AppleVisionImageDepthController();
InsertCamera camera = InsertCamera();
Size imageSize = const Size(640,640*9/16);
String? deviceId;
bool loading = true;
Uint8List? image;
late double deviceWidth;
late double deviceHeight;
int intr = 0;
[@override](/user/override)
void initState() {
camera.setupCameras().then((value){
setState(() {
loading = false;
});
camera.startLiveFeed((InputImage i){
if(i.metadata?.size != null){
imageSize = i.metadata!.size;
}
if(mounted) {
Uint8List? image = i.bytes;
visionController.processImage(ImageDepthData(image:image!, imageSize: imageSize)).then((data){
this.image = data;
if(intr == 0){
intr++;
}
setState(() {
});
});
}
});
});
super.initState();
}
[@override](/user/override)
void dispose() {
camera.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
deviceWidth = MediaQuery.of(context).size.width;
deviceHeight = MediaQuery.of(context).size.height;
return ListView(
children:<Widget>[
SizedBox(
width: 320,
height: 320*9/16,
child: loading?Container():CameraSetup(camera: camera, size: imageSize)
),
if(image != null) SizedBox(
width: 320,
height: 320*9/16,
child: Image.memory(
image!,
fit: BoxFit.fitHeight,
)
)
]
);
}
Widget loadingWidget(){
return Container(
width: deviceWidth,
height:deviceHeight,
color: Theme.of(context).canvasColor,
alignment: Alignment.center,
child: const CircularProgressIndicator(color: Colors.blue)
);
}
}
更多关于Flutter深度图像获取插件apple_vision_image_depth的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter深度图像获取插件apple_vision_image_depth的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter应用中使用apple_vision_image_depth
插件来获取深度图像的示例代码。这个插件允许你在iOS设备上使用Apple的Vision框架来获取深度图像数据。
首先,你需要在pubspec.yaml
文件中添加apple_vision_image_depth
依赖:
dependencies:
flutter:
sdk: flutter
apple_vision_image_depth: ^最新版本号 # 请替换为实际最新版本号
然后,运行flutter pub get
来安装依赖。
接下来是主要的Dart代码示例,展示如何使用这个插件来获取深度图像:
import 'package:flutter/material.dart';
import 'package:apple_vision_image_depth/apple_vision_image_depth.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: Scaffold(
appBar: AppBar(
title: Text('Depth Image Example'),
),
body: Center(
child: DepthImageExample(),
),
),
);
}
}
class DepthImageExample extends StatefulWidget {
@override
_DepthImageExampleState createState() => _DepthImageExampleState();
}
class _DepthImageExampleState extends State<DepthImageExample> {
Uint8List? _depthImageData;
Future<void> _captureDepthImage() async {
// 注意:这个插件仅支持iOS设备
if (!kIsIOS) {
return;
}
try {
// 请求深度图像
final depthImage = await AppleVisionImageDepth.captureDepthImage();
// 将深度图像数据转换为Uint8List以便后续处理或显示
setState(() {
_depthImageData = depthImage?.bytes;
});
// 这里你可以进一步处理深度图像数据,例如保存到文件或进行图像处理
// 例如,将深度图像转换为ImageProvider显示在UI上
if (_depthImageData != null) {
final imageProvider = Image.memory(_depthImageData!).imageProvider;
// 你可以使用imageProvider来显示图像,例如在Image widget中
}
} catch (e) {
print('Error capturing depth image: $e');
}
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: _captureDepthImage,
child: Text('Capture Depth Image'),
),
if (_depthImageData != null)
Image.memory(_depthImageData!), // 显示捕获的深度图像
],
);
}
}
注意事项:
- 这个插件仅支持iOS设备,因此在进行深度图像捕获之前,最好检查平台类型(如上例中的
kIsIOS
)。 - 深度图像数据可能非常大,因此在处理这些数据时要小心内存管理。
- 上面的代码示例仅展示了基本的深度图像捕获和显示功能。你可能需要根据你的应用需求进一步处理深度图像数据。
确保你已经正确配置了iOS项目的权限和配置,以便能够使用相机功能。这通常涉及在Info.plist
文件中添加必要的权限声明。