OpenCV+Mediapipe人物动作捕捉与Unity引擎的结合
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引擎的结合相关推荐
- OpenCV+Mediapipe手势动作捕捉与Unity引擎的结合
OpenCV+Mediapipe手势动作捕捉与Unity引擎的结合 前言 Demo演示 认识Mediapipe 项目环境 手势动作捕捉部分 实时动作捕捉 核心代码 完整代码 Hands.py py代码 ...
- 基于Unity引擎利用OpenCV和MediaPipe的面部表情和人体运动捕捉系统
基于Unity引擎利用OpenCV和MediaPipe的面部表情和人体运动捕捉系统 前言 项目概述 项目实现效果 2D面部表情实时捕捉 3D人体动作实时捕捉 补充 引用 前言 之前做的一个项目--使用 ...
- Mediapipe+OpenCV与Unity引擎实现动作捕捉
前言 之前写了一篇文章: Mediapipe+OpenCV图像识别技术与Unity引擎的结合 其中的技术是Python利用OpenCV图像捕捉,配合强大的Mediapipe库来实现人体动作检测与识别: ...
- OpenCV+Mediapipe+UDP+Unity挥手电子书翻页
OpenCV+Mediapipe+UDP+Unity挥手电子书翻页 效果视频如下 OpenCV+Mediapipe+UDP+Unity挥手翻页 Python端 其实很简单,基本都是现成的东西. 主要做 ...
- 基于mediapipe的动作捕捉和Unity的球棍模型同步
基于mediapipe的动作捕捉和Unity的球棍模型同步 所需环境 python端 unity端 效果 所需环境 这是我所使用的环境 python3.9 安装mediapipe和opencv-pyt ...
- 6.15 Unity引擎渲染效率全解析
UWA新晋主播赵福恺从Unity渲染模块中的各种渲染效果性能.PBR渲染性能以及阴影的渲染性能三个角度分别进行了详细的分析总结.为响应各大听众的需求,小编奉上完整视频回顾,同时也向看完直播才下班的五好 ...
- UNITY引擎变量调用产生不必要内存分配
UNITY引擎变量调用产生不必要内存分配 https://unity3d.com/de/learn/tutorials/topics/performance-optimization/optimizi ...
- Unity引擎及编辑器C#源代码发布
3月23日我们在GitHub上发布了Unity引擎和编辑器的C#源代码,仅供Unity学习参考使用. 为何如此决定 为了了解或改进自己的Unity项目,一直以来有用户对Unity .NET程序集反汇编 ...
- 【Unity开源项目精选】Unity引擎源码的C#部分
洪流学堂,让你快人几步.你好,我是你的技术探路者郑洪智,你可以叫我大智. 今天给你分享一个Unity开源项目,我们一起来看看吧! Unity引擎源码的C#部分 Unity 引擎和编辑器源代码的 C# ...
- Xunity.autotranslator机翻unity引擎的游戏
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.Xunity.autotranslator是什么? 二.使用步骤 1.下载 2.运行程序 3运行游戏 总结 前言 ...
最新文章
- Luogu 2470 [SCOI2007]压缩
- 《深入理解Java虚拟机》笔记5——类加载机制与字节码执行引擎
- python写小说阅读器_用python实现自己的小说阅读器!
- 静态static关键字修饰成员变量
- Tensorflow一些常用基本概念与函数
- NOIP2002复赛 普及组 第1题
- Oracle 实验4 更新数据
- Mac OS 常用终端命令(附代码)
- 记录PHP错误日志 display_errors与log_errors的区别
- Otsu详细算法解析
- CDN最通俗易懂的CDN解释
- Unity和Easy AR制作一个AR的APP
- eovs实训报告总结心得_实训报告心得体会
- ARM裸机-13.LCD
- java版阿里云发送短信
- continue 当条件不问那么执行你所对比的这个参数
- iphone导出视频 无法连接到设备_管理各种iOS设备文件的管理软件
- 网页抓取及信息提取(一)
- Java数组之一维数值数组之成绩统计
- 有苦有乐的算法 --- 获取二叉树的最大宽度