OpenCV+Mediapipe人物动作捕捉与Unity引擎的结合

  • 前言
  • Demo演示
  • 认识Mediapipe
  • 项目环境
  • 身体动作捕捉部分
  • 核心代码
    • 完整代码
      • Motion.py
      • 运行效果
  • Unity 部分
    • 建模
    • Line.cs
    • Action.cs
      • 最终实现效果

前言

本篇文章将介绍如何使用Python利用OpenCV图像捕捉,配合强大的Mediapipe库来实现人体动作检测与识别;将识别结果实时同步至Unity中,实现人物模型在Unity中运动身体结构识别

Demo演示

Demo展示:https://hackathon2022.juejin.cn/#/works/detail?unique=WJoYomLPg0JOYs8GazDVrw


本篇文章所用的技术会整理后开源,后续可以持续关注:
项目地址:https://github.com/BIGBOSS-dedsec/OpenCV-Unity-To-Build-3DPerson

GitHub:https://github.com/BIGBOSS-dedsec

CSDN: https://blog.csdn.net/weixin_50679163?type=edu

同时本篇文章实现的技术参加了稀土掘金2022编程挑战赛-游戏赛道-优秀奖
作品展示:https://hackathon2022.juejin.cn/#/works/detail?unique=WJoYomLPg0JOYs8GazDVrw

认识Mediapipe

项目的实现,核心是强大的Mediapipe ,它是google的一个开源项目:

功能 详细
人脸检测 FaceMesh 从图像/视频中重建出人脸的3D Mesh
人像分离 从图像/视频中把人分离出来
手势跟踪 21个关键点的3D坐标
人体3D识别 33个关键点的3D坐标
物体颜色识别 可以把头发检测出来,并图上颜色

Mediapipe Dev

以上是Mediapipe的几个常用功能 ,这几个功能我们会在后续一一讲解实现
Python安装Mediapipe

pip install mediapipe==0.8.9.1

也可以用 setup.py 安装
https://github.com/google/mediapipe

项目环境

Python 3.7
Mediapipe 0.8.9.1
Numpy 1.21.6
OpenCV-Python 4.5.5.64
OpenCV-contrib-Python 4.5.5.64


实测也支持Python3.8-3.9

身体动作捕捉部分

身体数据文件

这部分是我们通过读取视频中人物计算出每个特征点信息进行数据保存,这些信息很重要,后续在untiy中导入这些动作数据

关于身体特征点

核心代码

摄像头捕捉部分:

import cv2cap = cv2.VideoCapture(0)       #OpenCV摄像头调用:0=内置摄像头(笔记本)   1=USB摄像头-1  2=USB摄像头-2while True:success, img = cap.read()imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)       #cv2图像初始化cv2.imshow("HandsImage", img)       #CV2窗体cv2.waitKey(1)      #关闭窗体

视频帧率计算

import time#帧率时间计算
pTime = 0
cTime = 0while True
cTime = time.time()fps = 1 / (cTime - pTime)pTime = cTimecv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3,(255, 0, 255), 3)       #FPS的字号,颜色等设置

身体动作捕捉:

while True:if bboxInfo:lmString = ''for lm in lmList:lmString += f'{lm[1]},{img.shape[0] - lm[2]},{lm[3]},'posList.append(lmString)

完整代码

Motion.py

import cv2
from cvzone.PoseModule import PoseDetector# 读取cv来源,也可以调用摄像头使用
cap = cv2.VideoCapture('asoul.mp4')detector = PoseDetector()
posList = []while True:success, img = cap.read()img = detector.findPose(img)lmList, bboxInfo = detector.findPosition(img)if bboxInfo:lmString = ''for lm in lmList:lmString += f'{lm[1]},{img.shape[0] - lm[2]},{lm[3]},'posList.append(lmString)cv2.imshow("Image", img)key = cv2.waitKey(1)if key == ord('s'):with open("MotionFile.txt", 'w') as f:        # 将动作数据保存下来f.writelines(["%s\n" % item for item in posList])

运行效果

Unity 部分

建模

在Unity中,我们需要搭建一个人物的模型,这里需要一个33个Sphere作为身体的特征点33个Cube作为中间的支架
具体文件目录如下:

Line的编号对应人物模型特征点

Line.cs

这里是每个Line对应cs文件,实现功能:使特征点和Line连接在一起

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class LineCode : MonoBehaviour
{LineRenderer lineRenderer;public Transform origin;public Transform destination;void Start(){lineRenderer = GetComponent<LineRenderer>();lineRenderer.startWidth = 0.1f;lineRenderer.endWidth = 0.1f;}
// 连接两个点void Update(){lineRenderer.SetPosition(0, origin.position);lineRenderer.SetPosition(1, destination.position);}
}

Action.cs

这里是读取上文识别并保存的人物动作数据并将每个子数据循环遍历到每个Sphere点,使特征点随着视频中人物动作运动

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using System.Threading;public class AnimationCode : MonoBehaviour
{public GameObject[] Body;List<string> lines;int counter = 0;void Start(){// 读取MotionFile.txt的动作数据文件lines = System.IO.File.ReadLines("Assets/MotionFile.txt").ToList();}void Update(){string[] points = lines[counter].Split(',');// 循环遍历到每一个Sphere点for (int i =0; i<=32;i++){float x = float.Parse(points[0 + (i * 3)]) / 100;float y = float.Parse(points[1 + (i * 3)]) / 100;float z = float.Parse(points[2 + (i * 3)]) / 300;Body[i].transform.localPosition = new Vector3(x, y, z);}counter += 1;if (counter == lines.Count) { counter = 0; }Thread.Sleep(30);}
}

最终实现效果

这里的视频与Unity运行有延时

Good Luck,Have Fun and Happy Coding!!!

OpenCV+Mediapipe人物动作捕捉与Unity引擎的结合相关推荐

  1. OpenCV+Mediapipe手势动作捕捉与Unity引擎的结合

    OpenCV+Mediapipe手势动作捕捉与Unity引擎的结合 前言 Demo演示 认识Mediapipe 项目环境 手势动作捕捉部分 实时动作捕捉 核心代码 完整代码 Hands.py py代码 ...

  2. 基于Unity引擎利用OpenCV和MediaPipe的面部表情和人体运动捕捉系统

    基于Unity引擎利用OpenCV和MediaPipe的面部表情和人体运动捕捉系统 前言 项目概述 项目实现效果 2D面部表情实时捕捉 3D人体动作实时捕捉 补充 引用 前言 之前做的一个项目--使用 ...

  3. Mediapipe+OpenCV与Unity引擎实现动作捕捉

    前言 之前写了一篇文章: Mediapipe+OpenCV图像识别技术与Unity引擎的结合 其中的技术是Python利用OpenCV图像捕捉,配合强大的Mediapipe库来实现人体动作检测与识别: ...

  4. OpenCV+Mediapipe+UDP+Unity挥手电子书翻页

    OpenCV+Mediapipe+UDP+Unity挥手电子书翻页 效果视频如下 OpenCV+Mediapipe+UDP+Unity挥手翻页 Python端 其实很简单,基本都是现成的东西. 主要做 ...

  5. 基于mediapipe的动作捕捉和Unity的球棍模型同步

    基于mediapipe的动作捕捉和Unity的球棍模型同步 所需环境 python端 unity端 效果 所需环境 这是我所使用的环境 python3.9 安装mediapipe和opencv-pyt ...

  6. 6.15 Unity引擎渲染效率全解析

    UWA新晋主播赵福恺从Unity渲染模块中的各种渲染效果性能.PBR渲染性能以及阴影的渲染性能三个角度分别进行了详细的分析总结.为响应各大听众的需求,小编奉上完整视频回顾,同时也向看完直播才下班的五好 ...

  7. UNITY引擎变量调用产生不必要内存分配

    UNITY引擎变量调用产生不必要内存分配 https://unity3d.com/de/learn/tutorials/topics/performance-optimization/optimizi ...

  8. Unity引擎及编辑器C#源代码发布

    3月23日我们在GitHub上发布了Unity引擎和编辑器的C#源代码,仅供Unity学习参考使用. 为何如此决定 为了了解或改进自己的Unity项目,一直以来有用户对Unity .NET程序集反汇编 ...

  9. 【Unity开源项目精选】Unity引擎源码的C#部分

    洪流学堂,让你快人几步.你好,我是你的技术探路者郑洪智,你可以叫我大智. 今天给你分享一个Unity开源项目,我们一起来看看吧! Unity引擎源码的C#部分 Unity 引擎和编辑器源代码的 C# ...

  10. Xunity.autotranslator机翻unity引擎的游戏

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.Xunity.autotranslator是什么? 二.使用步骤 1.下载 2.运行程序 3运行游戏 总结 前言 ...

最新文章

  1. Luogu 2470 [SCOI2007]压缩
  2. 《深入理解Java虚拟机》笔记5——类加载机制与字节码执行引擎
  3. python写小说阅读器_用python实现自己的小说阅读器!
  4. 静态static关键字修饰成员变量
  5. Tensorflow一些常用基本概念与函数
  6. NOIP2002复赛 普及组 第1题
  7. Oracle 实验4 更新数据
  8. Mac OS 常用终端命令(附代码)
  9. 记录PHP错误日志 display_errors与log_errors的区别
  10. Otsu详细算法解析
  11. CDN最通俗易懂的CDN解释
  12. Unity和Easy AR制作一个AR的APP
  13. eovs实训报告总结心得_实训报告心得体会
  14. ARM裸机-13.LCD
  15. java版阿里云发送短信
  16. continue 当条件不问那么执行你所对比的这个参数
  17. iphone导出视频 无法连接到设备_管理各种iOS设备文件的管理软件
  18. 网页抓取及信息提取(一)
  19. Java数组之一维数值数组之成绩统计
  20. 有苦有乐的算法 --- 获取二叉树的最大宽度

热门文章

  1. 旋转向量解法(罗德里格公式推导及理解)
  2. 计算机毕业设计Java宠物收养管理系统(源码+系统+mysql数据库+lw文档)
  3. 已知四边形的四个点,求一个点是否在四边形之内的解决方法
  4. 路由器回执路由配置_IT菜鸟之路由器基础配置(静态、动态、默认路由)
  5. 华为s5700交换机IP地址与MAC地址绑定
  6. Vim插件之python-mode
  7. 7.2 异常处理(Exception Handing)
  8. 一步步教你批量压缩打包文件夹
  9. Android自定义星星评分控件
  10. html css使用特殊自定义字体避免侵权