Flutter相机视图插件pose_camera_view的使用

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

Flutter相机视图插件pose_camera_view的使用

PoseCameraView Widget

banner

PoseCameraView 是一个允许你在实时使用设备摄像头时检测和分析姿势的 Flutter 小部件,特别关注于俯卧撑跟踪。

安装

在你的 pubspec.yaml 文件中添加 pose_camera_view 到依赖项:

dependencies:
  pose_camera_view: <最新版本>

然后在代码中导入:

import 'package:pose_camera_view/pose_camera_view.dart';

如何使用

以下是一个简单的使用示例:

PoseCameraView(
  onPoseData: (poseData) {
    switch (poseData.pushUpState) {
      case PushUpState.middle:
        print("MIDDLE");
        break;
      case PushUpState.completed:
        print("COMPLETED");
        counterNotifier.value++;
        break;
      case PushUpState.init:
        print("INIT");
        break;
      case PushUpState.neutral:
        // 处理这个情况
        break;
    }
  },
  elbowAngleMin: 60.0,
  elbowAngleMax: 160.0,
)

参数

  • onPoseData: 一个回调函数,用于接收检测到的姿势数据。
  • elbowAngleMin: 最小肘部角度,以考虑有效的弯曲。
  • elbowAngleMax: 最大肘部角度,以考虑有效的弯曲。

推荐的俯卧撑状态

  • PushUpState.init: 俯卧撑初始位置。
  • PushUpState.middle: 俯卧撑进行到一半。
  • PushUpState.completed: 俯卧撑完成。

示例

为了获得更完整的示例,可以查看此存储库中的示例文件夹。以下是示例代码:

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Push up counter Example',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: const Text("Push up Counter Example"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
                onPressed: () {
                  Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (BuildContext context) => const PushUpScreenExample()));
                },
                child: const Text('Go to the push up counter'))
          ],
        ),
      ),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    final counterNotifier = ValueNotifier<int>(0);

    return SafeArea(
      child: Material(
        child: Stack(
          children: [
            PoseCameraView(
              onPoseData: (poseData) {
                switch (poseData.pushUpState) {
                  case PushUpState.middle:
                    print("MIDDLE");
                    break;
                  case PushUpState.completed:
                    print("COMPLETED");
                    counterNotifier.value++;
                    break;
                  case PushUpState.init:
                    print("INIT");
                    break;
                }
              },
              elbowAngleMin: 60.0,
              elbowAngleMax: 160.0,
            ),
            const BackButton(),
            Positioned(
              top: 40,
              left: 0,
              right: 0,
              child: ValueListenableBuilder<int>(
                valueListenable: counterNotifier,
                builder: (context, value, child) {
                  return Text(
                    'Push-ups: $value',
                    style: const TextStyle(
                      fontSize: 35,
                      color: Colors.white,
                      shadows: [
                        Shadow(
                          color: Colors.black,
                          offset: Offset(1, 1),
                          blurRadius: 2,
                        ),
                      ],
                    ),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter相机视图插件pose_camera_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter相机视图插件pose_camera_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter应用中使用pose_camera_view插件来集成相机视图的示例代码。请注意,pose_camera_view插件可能不是官方或广泛认可的插件,所以具体实现可能会有所不同。如果这是一个假设的或第三方插件,请确保你已经正确地在pubspec.yaml文件中添加了依赖项,并且已经运行了flutter pub get

首先,确保你的pubspec.yaml文件中包含了pose_camera_view依赖项(假设该插件存在):

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

然后,你可以按照以下步骤在你的Flutter应用中集成相机视图:

  1. 导入必要的包

在你的Dart文件中导入pose_camera_view包。

import 'package:flutter/material.dart';
import 'package:pose_camera_view/pose_camera_view.dart';  // 假设的包路径
  1. 创建相机视图页面

创建一个新的页面或widget来使用相机视图。

class CameraPage extends StatefulWidget {
  @override
  _CameraPageState createState() => _CameraPageState();
}

class _CameraPageState extends State<CameraPage> {
  PoseCameraController? _controller;

  @override
  void initState() {
    super.initState();
    // 初始化相机控制器
    _controller = PoseCameraController(
      // 配置相机,例如前置或后置摄像头等
      resolutionPreset: ResolutionPreset.high,
      enableAudio: false,
    );

    // 监听相机初始化状态
    _controller!.initialize().then((_) {
      if (!mounted) return;
      setState(() {});
    }).catchError((Object error) {
      print("Error initializing camera: $error");
    });
  }

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

  @override
  Widget build(BuildContext context) {
    if (_controller == null || !_controller!.value.isInitialized) {
      return Container();
    }
    return PoseCameraPreview(_controller!);
  }
}
  1. 在应用中导航到相机页面

在你的主应用或其他页面中添加一个按钮或导航逻辑来打开相机页面。

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Camera Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => CameraPage()),
              );
            },
            child: Text('Open Camera'),
          ),
        ),
      ),
    );
  }
}

请注意,上面的代码是基于假设的pose_camera_view插件的使用方式。实际使用时,你需要查阅该插件的官方文档或源代码来了解具体的API和配置选项。如果pose_camera_view插件不存在或API有所不同,你可能需要使用其他更流行的相机插件,如camera插件,并参考其官方文档进行集成。

回到顶部