Flutter媒体处理插件thinksys_mediapipe_plugin的使用

Flutter媒体处理插件thinksys_mediapipe_plugin的使用

ThinkSys Mediapipe 插件将姿态检测功能引入到 Flutter 应用程序中,填补了 iOS 开发者在这一领域的空白。它提供了实时跟踪功能,易于集成,并且可以定制选项,适用于健身和医疗保健应用。通过将 MediaPipe 的能力与 Flutter 框架相结合,我们使开发人员能够轻松构建基于运动的 iOS 应用程序。

Thinksys

设置

  1. 首先,在 pubspec.yaml 文件中添加依赖项,并在终端运行 flutter pub get
dependencies:
   thinksys_mediapipe_plugin: ^0.0.13
  1. example/ios/Info.plist 中添加相机使用权限:
<key>NSCameraUsageDescription</key>
<string>此应用使用相机获取出现在相机视野中的姿态关键点。</string>
  1. 运行 cd ios && pod install

  2. 运行 flutter pub get

属性

属性 描述
cameraFacing 定义使用哪个摄像头(前置或后置)。影响由 cameraFacing 提供的数据。
cameraOrientation 设置摄像头方向(竖屏或横屏)。影响由 cameraOrientation 提供的数据。
onLandmark 回调函数,用于检索身体关键点数据。
face 切换身体模型中面部的可见性。影响由 face 提供的数据。
leftArm 切换身体模型中左臂的可见性。影响由 leftArm 提供的数据。
rightArm 切换身体模型中右臂的可见性。影响由 rightArm 提供的数据。
leftWrist 切换身体模型中左手腕的可见性。影响由 leftWrist 提供的数据。
rightWrist 切换身体模型中右手腕的可见性。影响由 rightWrist 提供的数据。
torso 切换身体模型中躯干的可见性。影响由 torso 提供的数据。
leftLeg 切换身体模型中左腿的可见性。影响由 leftLeg 提供的数据。
rightLeg 切换身体模型中右腿的可见性。影响由 rightLeg 提供的数据。
leftAnkle 切换身体模型中左脚踝的可见性。影响由 leftAnkle 提供的数据。
rightAnkle 切换身体模型中右脚踝的可见性。影响由 rightAnkle 提供的数据。

使用方法

基本用法

以下是不带任何属性的基本使用 PoseLandmarks 小部件的方法:

import 'package:thinksys_mediapipe_plugin/pose_detection.dart';

PoseLandmarks(
  key: UniqueKey(),
)

使用相机方向选项

指定要使用的摄像头(前置或后置):

PoseLandmarks(
  key: UniqueKey(),
  cameraFacing: CameraFacing.front,
)

处理方向变化

处理方向变化(竖屏或横屏):

PoseLandmarks(
  key: UniqueKey(),
  options: PoseLandmarkOptions(
    cameraOrientation: orientation == Orientation.portrait
        ? CameraOrientation.portrait
        : CameraOrientation.landscape,
  ),
)

使用身体属性

自定义要跟踪的身体部位,如面部、左臂、右腿等:

PoseLandmarks(
  key: UniqueKey(),
  options: PoseLandmarkOptions(
    face: true,
    leftArm: true,
    rightArm: true,
    leftLeg: true,
    rightLeg: true,
    torso: true,
  ),
)

使用 onLandmark 属性

捕获并处理检测到的姿态关键点:

PoseLandmarks(
  key: UniqueKey(),
  options: PoseLandmarkOptions(
    poseLandmarks: (value) {
      print("Received Landmarks: $value");
    },
  ),
)

示例代码

以下是一个完整的示例代码,展示了如何使用该插件:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:thinksys_mediapipe_plugin/pose_detection.dart';
import 'package:thinksys_mediapipe_plugin_example/pose_example/landmarks_filter_options.dart';

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

class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: PoseExample(),
    );
  }
}

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

  [@override](/user/override)
  State<PoseExample> createState() => _PoseExampleState();
}

class _PoseExampleState extends State<PoseExample> {
  PoseLandmarkOptions options = PoseLandmarkOptions(
      face: true, leftArm: true, rightArm: true, leftLeg: true, torso: true, rightLeg: true);

  void _updateFilters(String key, bool value) {
    switch (key) {
      case "face":
        options.face = value;
        break;
      case "leftArm":
        options.leftArm = value;
        break;
      case "rightArm":
        options.rightArm = value;
        break;
      case "torso":
        options.torso = value;
        break;
      case "leftLeg":
        options.leftLeg = value;
        break;
      case "rightLeg":
        options.rightLeg = value;
        break;
      case "rightWrist":
        options.rightWrist = value;
        break;
      case "leftWrist":
        options.leftWrist = value;
        break;
      case "rightAnkle":
        options.rightAnkle = value;
        break;
      case "leftAnkle":
        options.leftAnkle = value;
        break;
    }
    setState(() {});
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
          appBar: AppBar(
            title: const Text("Camera View"),
            actions: [
              GestureDetector(
                  onTap: () {
                    Navigator.of(context).push(CupertinoPageRoute(
                        builder: (_) => LandmarksFilterOptions(
                              onFilterChange: _updateFilters,
                              defaultFilters: options.toJson(),
                            )));
                  },
                  child: const Icon(Icons.settings_input_component_sharp))
            ],
          ),
          body: poseLandmarks()),
    );
  }

  Widget poseLandmarks() {
    return OrientationBuilder(builder: (_, orientation) {
      return PoseLandmarks(
        key: UniqueKey(),
        options: PoseLandmarkOptions(
            cameraFacing: CameraFacing.front,
            cameraOrientation: orientation == Orientation.portrait
                ? CameraOrientation.portrait
                : CameraOrientation.landscape,
            face: true,
            leftLeg: true,
            rightLeg: true,
            leftArm: true,
            rightArm: true,
            torso: true,
            rightAnkle: true,
            leftAnkle: true,
            rightWrist: true,
            leftWrist: true),
        poseLandmarks: (value) {
          //  print("Received Landmarks : $value");
        },
      );
    });
  }
}

更多关于Flutter媒体处理插件thinksys_mediapipe_plugin的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter媒体处理插件thinksys_mediapipe_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 thinksys_mediapipe_plugin 插件在 Flutter 中进行媒体处理的示例代码。请注意,这个插件可能不是一个真实存在的插件,因此以下代码是一个假设性的示例,用于展示如何在 Flutter 中集成和使用一个假想的媒体处理插件。在实际使用中,你需要根据插件的实际文档进行调整。

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

dependencies:
  flutter:
    sdk: flutter
  thinksys_mediapipe_plugin: ^x.y.z  # 替换为实际版本号

然后,运行 flutter pub get 来获取插件。

接下来,在你的 Flutter 应用中使用这个插件。以下是一个简单的示例,展示了如何初始化插件并进行一些基本的媒体处理任务(如人脸检测)。

import 'package:flutter/material.dart';
import 'package:thinksys_mediapipe_plugin/thinksys_mediapipe_plugin.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'MediaPipe Plugin Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  ThinksysMediapipePlugin? _mediapipePlugin;

  @override
  void initState() {
    super.initState();
    // 初始化插件
    _mediapipePlugin = ThinksysMediapipePlugin();
    _mediapipePlugin!.initialize()!
        .then((value) {
          print('MediaPipe Plugin Initialized');
          // 开始媒体处理,例如人脸检测
          _startFaceDetection();
        })
        .catchError((error) {
          print('Error initializing MediaPipe Plugin: $error');
        });
  }

  @override
  void dispose() {
    // 释放资源
    _mediapipePlugin?.dispose();
    super.dispose();
  }

  Future<void> _startFaceDetection() async {
    try {
      // 开始人脸检测
      await _mediapipePlugin!.startFaceDetection()!;

      // 监听检测结果
      _mediapipePlugin!.faceDetectionResults!.listen((result) {
        // 处理检测结果,例如更新UI
        setState(() {
          // 假设结果是一个包含人脸边界框的列表
          List<Rect> faceBoxes = result;
          // 在这里更新你的UI组件,例如绘制边界框
        });
      });
    } catch (error) {
      print('Error starting face detection: $error');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('MediaPipe Plugin Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // 在这里显示你的视频流和检测结果
            // 例如,使用 CameraPreview 小部件显示视频流,并在上方绘制边界框
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 停止人脸检测
          _mediapipePlugin!.stopFaceDetection()!.then((value) {
            print('Face detection stopped');
          });
        },
        tooltip: 'Stop Face Detection',
        child: Icon(Icons.stop),
      ),
    );
  }
}

请注意,这个示例代码假设 thinksys_mediapipe_plugin 提供了 initialize(), startFaceDetection(), stopFaceDetection(), 和一个用于监听检测结果的流 faceDetectionResults。这些方法和属性在实际插件中可能有所不同,因此你需要参考插件的官方文档进行调整。

此外,由于 Flutter 插件通常依赖于原生代码(Android 和 iOS),因此在实际使用中,你可能还需要在 AndroidManifest.xmlInfo.plist 文件中添加必要的权限和配置。这些步骤将取决于插件的具体要求。

回到顶部