Flutter苹果设备视觉对象跟踪插件apple_vision_object_tracking的使用

Flutter苹果设备视觉对象跟踪插件apple_vision_object_tracking的使用

apple_vision_object_tracking

Apple Vision Selfie Detection 是一个 Flutter 插件,使 Flutter 应用程序能够使用 Apple Vision 对象检测

  • 该插件并非由 Apple 赞助或维护。作者是希望制作类似于 Google 的 ml kit 的开发者。

要求

MacOS

  • 最低 osx 部署目标:10.14
  • Xcode 13 或更新版本
  • Swift 5
  • ML Kit 仅支持 64 位架构(x86_64 和 arm64)。

iOS

  • 最低 ios 部署目标:12.0
  • Xcode 13 或更新版本
  • Swift 5
  • ML Kit 仅支持 64 位架构(x86_64 和 arm64)。

入门指南

首先需要导入 'package:apple_vision_object_tracking/apple_vision_object_tracking.dart'

import 'package:apple_vision_object_tracking/apple_vision_object_tracking.dart';

final GlobalKey cameraKey = GlobalKey(debugLabel: "cameraKey");
AppleVisionObjectTrackingController visionController = AppleVisionObjectTrackingController();
InsertCamera camera = InsertCamera();
Size imageSize = const Size(640,640*9/16);
String? deviceId;
bool loading = true;

List<Rect>? objectData;
late double deviceWidth;
late double deviceHeight;

[@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(image!, imageSize).then((data){
          objectData = data;
          //ßprint(objectData!.objects);
          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 Stack(
    children:[
      SizedBox(
        width: imageSize.width, 
        height: imageSize.height, 
        child: loading?Container():CameraSetup(camera: camera, size: imageSize)
    ),
    ]+showRects()
  );
}

List<Widget> showRects(){
  if(objectData == null || objectData!.isEmpty) return [];
  List<Widget> widgets = [];

  for(int i = 0; i < objectData!.length; i++){
    //if(objectData!.objects[i]. confidence > 0.5){
      widgets.add(
        Positioned(
          top: objectData![i].top,
          left: objectData![i].left,
          child: Container(
            width: objectData![i].width*imageSize.width,
            height: objectData![i].height*imageSize.height,
            decoration: BoxDecoration(
              color: Colors.transparent,
              border: Border.all(width: 3, color: Colors.green),
              borderRadius: BorderRadius.circular(5)
            ),
          )
        )
      );
    //}
  }
  return widgets;
}

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_object_tracking的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter苹果设备视觉对象跟踪插件apple_vision_object_tracking的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


apple_vision_object_tracking 是一个用于在 Flutter 应用中实现对象跟踪的插件,特别针对苹果设备(iOS)进行了优化。它利用苹果的 Vision 框架来实现高效的对象跟踪功能。以下是如何在 Flutter 项目中使用该插件的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 apple_vision_object_tracking 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  apple_vision_object_tracking: ^0.0.1 # 请检查最新版本

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

2. 导入插件

在你的 Dart 文件中导入插件:

import 'package:apple_vision_object_tracking/apple_vision_object_tracking.dart';

3. 初始化对象跟踪器

在使用对象跟踪功能之前,你需要初始化 AppleVisionObjectTracking 实例:

final objectTracker = AppleVisionObjectTracking();

4. 开始对象跟踪

你可以使用 trackObject 方法来开始跟踪对象。通常,你需要提供一个图像或视频帧,并指定要跟踪的对象的初始位置。

// 假设你有一个图像文件
final imageFile = File('path_to_image.jpg');

// 读取图像文件为字节数据
final imageBytes = await imageFile.readAsBytes();

// 指定初始对象的位置 (例如,一个矩形区域)
final initialRect = Rect.fromLTWH(100, 100, 200, 200);

// 开始跟踪对象
final trackedRect = await objectTracker.trackObject(
  imageBytes: imageBytes,
  initialRect: initialRect,
);

// 输出跟踪结果
print('Tracked object position: $trackedRect');

5. 处理跟踪结果

trackObject 方法会返回一个 Rect 对象,表示当前帧中跟踪对象的位置。你可以根据这个位置更新 UI 或在图像上绘制矩形框。

6. 持续跟踪

如果你有连续的图像帧(例如来自摄像头的实时视频流),你可以在每一帧上调用 trackObject 方法,并根据返回的 Rect 更新对象的位置。

// 假设你有一个连续的图像流
for (var frame in imageStream) {
  final trackedRect = await objectTracker.trackObject(
    imageBytes: frame,
    initialRect: trackedRect, // 使用上一帧的跟踪结果作为初始位置
  );

  // 更新 UI 或绘制跟踪框
  updateUI(trackedRect);
}

7. 释放资源

当你不再需要对象跟踪器时,记得释放资源:

objectTracker.dispose();

8. 处理错误

在实际使用中,可能会出现各种错误(例如,图像格式不受支持、跟踪失败等)。你可以使用 try-catch 来捕获并处理这些错误:

try {
  final trackedRect = await objectTracker.trackObject(
    imageBytes: imageBytes,
    initialRect: initialRect,
  );
  print('Tracked object position: $trackedRect');
} catch (e) {
  print('Object tracking failed: $e');
}
回到顶部