首页 > 其他分享 >WinUI(WASDK)使用MediaPipe检查人体姿态关键点

WinUI(WASDK)使用MediaPipe检查人体姿态关键点

时间:2023-07-13 22:11:32浏览次数:44  
标签:MediaPipe right mat2 WASDK image WinUI var left

前言

之前有用这个MediaPipe.NET .NET包装库搞了手势识别,丰富了稚晖君的ElectronBot机器人的第三方上位机软件的功能,MediaPipe作为谷歌开源的机器视觉库,功能很丰富了,于是就开始整活了,来体验了一把人体姿态关键点检测。

pose

所用框架介绍

1. WASDK

这个框架是微软最新的应用开发框架,我是用来开发程序的主体,做一些交互和功能的承载,本质上和wpf,uwp这类程序没什么太大的区别,区别就是一些工具链的不同。

2. MediaPipe

MediaPipe offers open source cross-platform, customizable ML solutions for live and streaming media.

我主要使用MediaPipe进行人体姿态关键点坐标的提取,我的需求是将人体关键点坐标实时提取,并且同步到模型机器人的骨骼上,来实现同步的功能,但是这个博客只展示关键点的获取。

官方文档地址

pose-doc

推荐文档

MediaPipe 集成人脸识别,人体姿态评估,人手检测模型

代码讲解(干货篇)

1. 项目介绍

项目地址

项目结构如下图:

img

注意

由于MSIX打包的WASDK的路径访问为虚拟文件系统所以我们需要在项目里加入VFS目录,将引用的mediapipe的模块和dll放进去,不然会导致代码无法使用。

详情见如下文档:
打包的 VFS 位置

还有经过本人的测试,模型需要下载【Pose landmarker (Heavy)】的,不然检查不到坐标点。

img

特别注意的点,记得下载mediapipe的源码,将对应的模块依赖下载复制到对应的的目录,如果模型解压之后的名称和图片的不匹配记得修改文件名称之后复制到对应的目录,代码仓库就不上传模型文件了。

model

软件处理过程如下:

=>WinUI(WASDK)项目打开图片

=>OpencvSharp处理图片数据

=>转换成ImageFrame

=>MediaPipe处理返回人体姿态关键点坐标数据

=>软件通过win2d将坐标绘制到图片上

2.核心代码讲解

核心代码如下:

这段代码是将图片读取处理并且通过mediapipe获取坐标返回

  private async void StartButton_Click(object sender, RoutedEventArgs e)
    {
        var matData = new OpenCvSharp.Mat(Package.Current.InstalledLocation.Path + $"\\Assets\\pose.jpg");

        var mat2 = matData.CvtColor(OpenCvSharp.ColorConversionCodes.BGR2RGB);

        var dataMeta = mat2.Data;

        var length = mat2.Width * mat2.Height * mat2.Channels();

        var data = new byte[length];

        Marshal.Copy(dataMeta, data, 0, length);

        var widthStep = (int)mat2.Step();

        var imgframe = new ImageFrame(ImageFormat.Types.Format.Srgb, mat2.Width, mat2.Height, widthStep, data);

        PoseOutput handsOutput = calculator.Compute(imgframe);

        if (handsOutput.PoseLandmarks != null)
        {
            _poseOutput = handsOutput;

            CanvasControl1.Invalidate();
            var landmarks = handsOutput.PoseLandmarks.Landmark;
            Console.WriteLine($"Got pose output with {landmarks.Count} landmarks");
        }
        else
        {
            Console.WriteLine("No pose landmarks");
        }
    }

将结果绘制到图片上的代码如下,采用win2d绘制

    private void CanvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
    {
        if (_image != null)
        {
            // Draw the image
            args.DrawingSession.DrawImage(_image);

        }

        if (_poseOutput != null)
        {


            var poseLineList = _poseOutput.GetPoseLines(_image.Size.Width, _image.Size.Height);
            foreach (var postLine in poseLineList)
            {
                args.DrawingSession.DrawLine(postLine.StartVector2, postLine.EndVector2, Microsoft.UI.Colors.Green, 4);
            }
            foreach (var Landmark in _poseOutput?.PoseLandmarks?.Landmark)
            {

                var x = (int)_image.Size.Width * Landmark.X;
                var y = (int)_image.Size.Height * Landmark.Y;
                // Draw a point at (100, 100)
                args.DrawingSession.DrawCircle(x, y, 2, Microsoft.UI.Colors.Red, 2);
            }
        }
    }

效果如下:

img

人体点对应关系如图:

img

0 - nose
1 - left eye (inner)
2 - left eye
3 - left eye (outer)
4 - right eye (inner)
5 - right eye
6 - right eye (outer)
7 - left ear
8 - right ear
9 - mouth (left)
10 - mouth (right)
11 - left shoulder
12 - right shoulder
13 - left elbow
14 - right elbow
15 - left wrist
16 - right wrist
17 - left pinky
18 - right pinky
19 - left index
20 - right index
21 - left thumb
22 - right thumb
23 - left hip
24 - right hip
25 - left knee
26 - right knee
27 - left ankle
28 - right ankle
29 - left heel
30 - right heel
31 - left foot index
32 - right foot index

特别感谢的项目就是这个MediaPipe.NET了,没有它就没有我的这篇文章,更没有我的项目了。

个人感悟

又到了个人感悟环节,这次感觉舒服多了,因为看着wasdk框架的版本号越来越高,功能也越来越完善了。

总之是朝着好的方向发展了,希望别步了uwp的后尘,喜欢的话记得star一下了。

参考推荐文档如下

demo地址

WASDK文档地址

MediaPipe

MediaPipe.NET

ElectronBot

ElectronBot.DotNet

标签:MediaPipe,right,mat2,WASDK,image,WinUI,var,left
From: https://www.cnblogs.com/GreenShade/p/17552324.html

相关文章

  • WINUI 引入 CommunityToolkit.WinUI.UI进行数据验证
     先在xaml命名空间中引入  xmlns:ui="using:CommunityToolkit.WinUI.UI"textbox中进行IP验证如下:<TextBoxx:Name="textBox"Width="200"Height="30"Background="AliceBlue"ui:TextBoxExten......
  • WinUI ComboBox加载时不能正常显示绑定属性
    搞WINUI时发现下述问题:ComboBox的item1绑定了一个属性,但是程序在加载完成后,页面上并不能正常显示(已经设置了默认选择为ComboBox绑定属性那个item,但是就不正常);而TextBlock绑定相同的属性,是能正常显示的。 具体现象如下,左红色框中为TextBlock,右蓝色框中为ComboBox。 其xam......
  • Mediapipe实时3D目标检测和跟踪(自动驾驶实现)
    ......
  • WinUI 保证程序单开
     参考代码如下:protectedstaticvoidOnlyOneApp(){stringappName=typeof(App).Namespace;_=newMutex(true,appName,outboolcreateNew);if(!createNew){ShowNotification("提......
  • 聊聊MAUI、WinUI3和WPF的优势及劣势
    今天在群里聊到WinUI3的学习及发展,还有他那堪比玩具的使用体验,正好梳理一篇关于WinUI3、MAUI和WPF优劣势,我整理的不是很好,所以又让ChatGPT在生成了一遍,感觉整体还可以。看完可以相互讨论一下;引言:在应用程序开发领域,选择合适的框架对于开发人员和业务来说至关重要。本文将比较并......
  • .NET中的winform、wpf、winui和maui你都知道吗?
    前言    年初.NET工程师的求职者反馈不好找工作,尤其是B/S开发,C/S开发稍微好点。这种情况下有好多小伙伴都想转行了,于是了解了一下JAVA,比.NET还卷,还是走.NET内部转行吧......
  • WinUI中的新用法
    这里是指新的桌面开发框架WinUI3,WinUI2只是UWP的一个库。主要介绍了我在开发中遇到的常见的功能在WinUI3中不同与WPF或UWP的使用方式的写法。文件选择器WPF:OpenFileDia......
  • WinUI的单例实现方法
    在OnLaunched中处理单例打开App.xaml.cs文件,编辑OnLaunched方法protectedoverrideasyncvoidOnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgsargs){ va......
  • 第一个WinUI程序
    概述WinUI是Windows上最新的UI开发框架,属于WindowsAppSDK的一部分。对于开发者需要知道的是:开发工具为VisualStudio2019或VisualStudio2022。支持使用C+......
  • NetCore+Python实现视频上传mediapipe骨骼标注
     打开网页,选择视频,上传视频,解析完成后播放及视频下载   usingMicrosoft.AspNetCore.Hosting;usingMicrosoft.AspNetCore.Http;usingMicrosoft.AspNetCore.Mvc......