前言

之前写了一篇文章:# Mediapipe+OpenCV图像识别技术与Unity引擎的结合

其中的技术是Python利用OpenCV图像捕捉,配合强大的Mediapipe库来实现人体动作检测与识别;将识别结果实时同步至Unity中,实现人物模型在Unity中运动身体结构识别

技术更新

因为之前的人物动作捕捉是先通过PythonMediapipe先将人物动作进行捕捉,将捕捉到的数据format后写入到txt中,在Unity端对txt进行数据读取,进而实现Unity人物运动;其中的缺点是:没有时效性

而本次的改进:通过利用socket和UPD通信,在localhost中数据传输,让动捕数据实时传输,到达实时动捕的效果

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)

数据传输:

# 定义localhost和端口
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverAddressPort = ("127.0.0.1", 5054)# 数据发送
date = lmString
sock.sendto(str.encode(str(date)), serverAddressPort)

完整代码

MotionCapPRO.py

import cv2
from cvzone.PoseModule import PoseDetector
import socket# cap = cv2.VideoCapture('1.mp4')
cap = cv2.VideoCapture(0)sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverAddressPort = ("127.0.0.1", 5054)      # 定义localhost与端口,当然可以定义其他的hostdetector = PoseDetector()
posList = []    # 保存到txt在unity中读取需要数组列表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)# print(len(posList))       print(lmString)date = lmStringsock.sendto(str.encode(str(date)), serverAddressPort)cv2.imshow("Image", img)key = cv2.waitKey(1)# 记录数据到本地# if key == ord('r'):    with open("MotionData.txt", 'w') as f:f.writelines(["%s\n" % item for item in posList])

运行效果


Unity 部分

建模

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

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

UPD.cs (用于接收端口数据)

using UnityEngine;
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;public class UDPReceive : MonoBehaviour
{Thread receiveThread;UdpClient client; public int port = 5052;public bool startRecieving = true;public bool printToConsole = false;public string data;public void Start(){receiveThread = new Thread(new ThreadStart(ReceiveData));receiveThread.IsBackground = true;receiveThread.Start();}private void ReceiveData(){client = new UdpClient(port);while (startRecieving){try{IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);byte[] dataByte = client.Receive(ref anyIP);data = Encoding.UTF8.GetString(dataByte);if (printToConsole) { print(data); }}catch (Exception err){print(err.ToString());}}}
}


(水印是我的,非盗用)

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 UnityEngine;public class body : MonoBehaviour
{// Start is called before the first frame updatepublic UDPReceive udpReceive;public GameObject[] bodyPoints;void Start(){}// Update is called once per framevoid Update(){string data = udpReceive.data;// data = data.Remove(0, 1);// data = data.Remove(data.Length - 1, 1);print(data);string[] points = data.Split(',');print(points[0]);//0        1*3      2*3//x1,y1,z1,x2,y2,z2,x3,y3,z3for (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;bodyPoints[i].transform.localPosition = new Vector3(x, y, z);}}
}

最终实现效果

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

Good Luck,Have Fun and Happy Coding!!!

Mediapipe+OpenCV图像识别技术与Unity引擎的结合-Part2相关推荐

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

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

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

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

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

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

  4. 盛大游戏技术总监徐峥:Unity引擎使用的三种方式

    在5月13日Unite 2017 案例分享专场上,盛大游戏技术总监徐峥分享了使用Unity引擎的三种方式,以下为详细内容: 大家好,我先简单介绍一下我自己,我是盛大游戏的技术总监徐峥.我今天想分享的主 ...

  5. FBEC2021 | Unity大中华区平台技术总监杨栋:从Unity引擎出发,助推元宇宙技术实现

    2021未来商业生态链接大会暨第六届金陀螺奖颁奖典礼(简称"FBEC2021")于2021年12月10日在深圳市大中华喜来登酒店盛大召开,本次大会由广东省游戏产业协会.广东省虚拟现 ...

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

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

  7. Unity 引擎开始从 Mono 迁移到 .NET CoreCLR

    目录 ​编辑 ​编辑 现状 过去 过去,Unity 选择 Mono 未来 未来,Unity 选择 CoreCLR 现状 Unity 引擎开发团队宣布,他们已开始将 Unity 引擎运行时从 Mono ...

  8. Unity引擎UI模块知识Tree

    Unity引擎在4.6版本之前是没有内置的UI解决方案的.当时最流行的就是NGUI的框架,目前主流的UI解决方案就是NGUI和UGUI,近几年来,更是以UGUI为主,同时也有团队开始使用FairyGU ...

  9. opencv 图像识别

    opencv的目标是使计算机可以快速准确地从数字图像中提取和分析特征.它使用了许多新的算法和技术,例如改进的模板匹配.基于统计的特征分析以及深度学习等.opencv支持多种平台,包括 Windows. ...

  10. 访日本Marza团队:Unity引擎制作VR动画实践

    在UNITE 2016 Shanghai上,日本世嘉飒美集团旗下的动画制作公司Marza引得了满堂喝彩,其使用Unity引擎制作动画的经验吸引了许多开发者膜拜学习.在演讲之后,我们采访了Marza团队 ...

最新文章

  1. 巧用组策略关闭危险端口
  2. 第3周实践项目5 -顺序表的应用 拆分单链表
  3. hdu 3449(依赖背包)
  4. 详谈Windows消息循环机制
  5. 【Android】Fragment的简单笔记
  6. [嵌入式]A/D转换器
  7. 微信突然限制,你的小程序链接还好吗?
  8. favicon.ico显示,favicon显示,favicon图标显示
  9. jmeter ramp-up-period设置以及同步定时器使用
  10. 面向大规模商业系统的数据库设计和实践
  11. 用安卓手机搭建一个可用渗透测试环境/安卓手机搭建linux环境
  12. c语言进程伪装,易语言程序伪装软件
  13. java 快递100_使用快递100 查询链接实现快速查询的示例
  14. Python数据库开发之-pymysql模块
  15. 仿微信通讯录的Demo----PinnedHeaderListView
  16. vue 打包之后不兼容ie_vue项目打包后在IE浏览器报错,页面显示空白
  17. MySQL数据库-更新表中的数据详解
  18. Windows10连接Google手机,短信照片同步折腾记录
  19. IE网页出现js错误修复方法_离水的鱼_新浪博客
  20. 【Simulink教程案例13】基于QPSK的位同步simulink建模与仿真分析

热门文章

  1. 京东非自营下运费模式
  2. 软考高级 真题 2015年上半年 信息系统项目管理师 综合知识
  3. 【密码科普】第7期 - 凯撒密码与密码机
  4. 计算机系统(六):应用层(上篇)
  5. 点电荷分布matlab仿真,利用Matlab模拟点电荷的电场分布..doc
  6. html 出现脚本错误,当前页面脚本发生错误,教您当前页面脚本发生错误的解决方法...
  7. 【JVM】Java IDEA 配置项目的JVM运行内存大小
  8. RT-Thread操作系统
  9. 1.17 “干项目太累,那是因为姿势不对” Stacey矩阵
  10. sqlserver数据库的使用