前言

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

所用框架介绍

1. WASDK

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

2. MediaPipe

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

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

官方文档地址

推荐文档

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

代码讲解(干货篇)

1. 项目介绍

项目地址

项目结构如下图:

注意

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

详情见如下文档:

打包的 VFS 位置

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

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

软件处理过程如下:

=>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);
}
}
}

效果如下:

人体点对应关系如图:

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

WinUI(WASDK)使用MediaPipe检查人体姿态关键点的更多相关文章

  1. WinUI(WASDK)使用MediaPipe检查手部关键点并通过ML.NET进行手势分类

    前言 之所以会搞这个手势识别分类,其实是为了满足之前群友提的需求,就是针对稚晖君的ElectronBot机器人的上位机软件的功能丰富,因为本来擅长的技术栈都是.NET,也刚好试试全能的.NET是不是真 ...

  2. 人体姿态和形状估计的视频推理:CVPR2020论文解析

    人体姿态和形状估计的视频推理:CVPR2020论文解析 VIBE: Video Inference for Human Body Pose and Shape Estimation 论文链接:http ...

  3. Facebook提出DensePose数据集和网络架构:可实现实时的人体姿态估计

    https://baijiahao.baidu.com/s?id=1591987712899539583 选自arXiv 作者:Rza Alp Güler, Natalia Neverova, Ias ...

  4. 快速人体姿态估计:CVPR2019论文阅读

    快速人体姿态估计:CVPR2019论文阅读 Fast Human Pose Estimation 论文链接: http://openaccess.thecvf.com/content_CVPR_201 ...

  5. 人体姿态的相似性评价基于OpenCV实现最近邻分类KNN K-Nearest Neighbors

    最近学习了人体姿态的相似性评价.需要用到KNN来统计与当前姿态相似的k个姿态信息. 假设我们已经有了矩阵W和给定的测试样本姿态Xi,需要寻找与Xi相似的几个姿态,来估计当前Xi的姿态标签. //knn ...

  6. openpose模型在AI challenge人体骨骼关键点检测的表现

    因为之前正好看了CMU在CVPR2017上的论文<Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields>, ...

  7. openpose-opencv 的body数据多人体姿态估计

    介绍 opencv除了支持常用的物体检测模型和分类模型之外,还支持openpose模型,同样是线下训练和线上调用.这里不做特别多的介绍,先把源代码和数据放出来- 实验模型获取地址:https://gi ...

  8. openpose-opencv 的coco数据多人体姿态估计

    介绍 opencv除了支持常用的物体检测模型和分类模型之外,还支持openpose模型,同样是线下训练和线上调用.这里不做特别多的介绍,先把源代码和数据放出来- 实验模型获取地址:https://gi ...

  9. 论文笔记 M. Saquib Sarfraz_Pose-Sensitive Embedding_re-ranking_2018_CVPR

    1. 摘要 作者使用一个pose-sensitive-embddding,把姿态的粗糙.精细信息结合在一起应用到模型中. 用一个新的re-ranking方法,不需要重新计算新的ranking列表,是一 ...

  10. COCO数据集使用

    一.简介 官方网站:http://cocodataset.org/全称:Microsoft Common Objects in Context (MS COCO)支持任务:Detection.Keyp ...

随机推荐

  1. LINUX 下LAMP之yum方法部署环境

    一. 系统组成 系统由前台网站和后台保种服务两部分组成,其中后台保种可以扩展成多台设备,提高保种的资源量以及性能.下面安装以houtaiip代表后台保重服务器ip地址,qiantaiip代表前台网站i ...

  2. Midjourney:一步一步教你如何使用 AI 绘画 MJ

    一步一步如何使用 Midjourney 教程:教学怎么用 MJ? 一.Midjourney(MJ)是什么? Midjourney是一款使用文字描述来生成高质量图像的AI绘画工具.这篇文章主要介绍了Mi ...

  3. 全平台数据(数据库)管理工具 DataCap 管理 Rainbond 上的所有数据库

    DataCap是用于数据转换.集成和可视化的集成软件,支持多种数据源.文件类型.大数据相关数据库.关系数据库.NoSQL数据库等.通过该 DataCap 可以实现对多个数据源的管理,对数据源下的数据进 ...

  4. RabbitMQ详解(下)

    一:序 通过<RabbitMQ详解(上)>一文中,我们可以知道RabbitMQ的一些基本的原生用法,如交换机的创建及消息的投递,但是在企业中我们大部分都是把RabbitMQ集成到Sprin ...

  5. Swift WisdomProtocol 面向协议编程(下)

    WisdomProtocol 面向协议编程(下) @[TOC] WisdomProtocol SDK 面向协议编程 # Welcome to use WisdomProtocol WisdomProt ...

  6. Prism Sample 12-UsingCompositeCommands

    本例中,主页是一个按钮,绑定了一个复合命令,然后下面一个TabControl <Grid> <Grid.RowDefinitions> <RowDefinition He ...

  7. 推荐一个.Net Core开发的Websocket群聊、私聊的开源项目

    今天给大家推荐一个使用Websocket协议实现的.高性能即时聊天组件,可用于群聊.好友聊天.游戏直播等场景. 项目简介 这是一个基于.Net Core开发的.简单.高性能的通讯组件,支持点对点发送. ...

  8. #Powerbi 季度时间进度计算

    上一篇我们学习了月度时间进度的计算方法,今天我们学习季度时间进度的测算. 思路:找出目前共计消耗了多少天(季度),目前日期所在的季度共有多少天,两者相除即是季度的时间进度 首先列出DAX函数:   本 ...

  9. 2023-03-19:使用Go语言和FFmpeg库实现pcm编码为mp3。

    2023-03-19:使用Go语言和FFmpeg库实现pcm编码为mp3. 答案2023-03-19: 本文将介绍如何使用Go语言和FFmpeg库实现PCM音频文件编码为MP3格式.我们将使用moon ...

  10. 2021-08-29:N * M的棋盘(N和M是输入参数),每种颜色的格子数必须相同的,上下左右的格子算相邻,相邻格子染的颜色必须不同,所有格子必须染色,返回至少多少种颜色可以完成任务。 福大大 答

    2021-08-29:N * M的棋盘(N和M是输入参数),每种颜色的格子数必须相同的,上下左右的格子算相邻,相邻格子染的颜色必须不同,所有格子必须染色,返回至少多少种颜色可以完成任务. 福大大 答案 ...