使用unity3d和tensorflow实现基于姿态估计的体感游戏
使用unity3d和tensorflow实现基于姿态估计的体感游戏
前言
之前做姿态识别,梦想着以后可以自己做出一款体感游戏,然而后来才发现too young。但是梦想还是要有的,万一实现了呢。趁着paper发出去的这几天,做一个toy demo。研究了一下如何将姿态估计的结果应用于unity,参考了很多资料,最终决定使用UDP协议,让unity脚本接收python脚本的数据(关节点坐标),来达到控制object的目的,由于刚接触unity时间不长(c#也是刚接触的),所以肯定有很多不足,欢迎交流。demo的代码和模型地址https://github.com/bBobxx/MyPoseWithUnity3d
python脚本
Recognition.py,需要安装tensorflow和opencv-python
python脚本这边就是普通的姿态估计的tensorflow程序,只不过要调用socket包,用来发送数据。这边我设定的是
UDP_IP = "127.0.0.1"
UDP_PORT = 5065
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
端口可以更改,只要确定没占用就行。
后面的dataProcess函数是将图片处理成我的网络的输入,这边的姿态估计算法是我论文中的网络,识别率不是很高,但是凑活,相比于那些识别率很高的,速度也快点,在笔记本的cpu上能达到3FPS左右,勉强能用,我这边的模型使用的是cpu,gpu能不能用没测试过,当然这里完全可以换成别的姿态识别模型,最重要的地方是
string_send = 'st,'
for w in range(nr_joint):
string_send += str(x_c[w])+','+str(y_c[w])+','
string_send += 'end'
sock.sendto( string_send.encode(), (UDP_IP, UDP_PORT) )
一定要将数字转换成字符串,并且encode(),当然这里加不加开头和结尾没那么重要,但是加上可以在unity那边判断一下。
c sharp脚本
playerControllerScript.cs, move.cs前者放在Sphere上,后者放在Cube上。
在unity那边首先要建立关节点代表的sphere,我这边是这样设置的,注意sphere的层次关系和名字一定要跟我一样:

cube是为了玩加上去的,可以不用这些。看一下c#这边的接受函数
private void ReceiveData()
{
client = new UdpClient (port);
while (true)
{
try
{
IPEndPoint anyIP = new IPEndPoint(IPAddress.Parse("0.0.0.0"), port);
byte[] data = client.Receive(ref anyIP);
string text = Encoding.UTF8.GetString(data); //这边记得在解码,port是之前python脚本的端口
string[] strArray = text.Split(',');
int[] coord1 = new int[32];
for (int i = 1; i<strArray.Length-1;++i) {
int x = Int32.Parse(strArray[i]);
coord1[i-1] = x;
}
if (updateCoord) {
coord = coord1;
updateCoord = false;
}
} catch(Exception e)
{
print (e.ToString());
}
}
}
这部分的代码主要参考的这篇博客https://www.raywenderlich.com/5475-introduction-to-using-opencv-with-unity
然后将姿态估计的结果应用到每个小球上就可以了,这里我的demo中将小球和方块添加了刚体和碰撞属性,这部分如果不清楚就去查资料吧,我也是刚入门,就不误导了。这是update函数中干的事情:
void Update ()
{
if (!updateCoord){
for (int i=0; i<16;i++) {
string obj = "Sphere (" + Convert.ToString(i+1)+")";
GameObject spherei = sphere.transform.Find(obj).gameObject;
if (coord[2*i] >0 && coord[2*i+1]>0) {
int x = coord[2*i]-320;
int y = coord[2*i+1]-240;
spherei.transform.position = new Vector3(x, y, 0.0f);
}
else
spherei.transform.position = new Vector3(-1000.0f, -1000.0f, 0.0f);
updateCoord = true;
}
}
}
我的笔记本的相机拍出的图片大小是640*480的,所以上面将x,y坐标减了一半,这里可能需要改,或者直接不减也可以。这里的z坐标是0,是因为这是2d姿态估计,3d的以后如果有结果再实现。
效果图

小球太大的结果QAQ,所以有重叠,真人的话就好点了。编译了一个64位linux的执行文件,链接:[https://pan.baidu.com/s/19P5ebRN7dUXNcN2n7EQLXQ] (https://pan.baidu.com/s/19P5ebRN7dUXNcN2n7EQLXQ) 提取码: ju73。
使用unity3d和tensorflow实现基于姿态估计的体感游戏的更多相关文章
- 【CityHunter】基于LBS的AR体感游戏设计理念
本人目前还不是游戏行业的圈内人士,并不懂得,游戏行业的生态圈,也不懂得,所谓的什么“中国市场环境”.所以不敢发表关于这方面的见解,不过我在这里想要插一句话,就是我认为啊,行业内,人与人之间还是有分层次 ...
- OpenNI结合Unity3D Kinect进行体感游戏开发(转)
OpenNI结合Unity3D Kinect进行体感游戏开发(转) 楼主# 更多 发布于:2012-07-17 16:42 1. 下载安装Unity3D(目前版本为3.4)2. 下载OpenN ...
- 历时一周,unity3d+xtion打造我的第一个休闲体感小游戏《空降奇兵》
1.游戏介绍 本游戏属于休闲小游戏,主要操作如下: 菜单控制:举起左手或右手,点击左边或者右边的菜单:挥动左手或右手,选择关卡: 操作方式:玩家跳跃,游戏中的伞兵从飞机开始降落:玩家通过控制伞兵的左右 ...
- Tensorflow之基于MNIST手写识别的入门介绍
Tensorflow是当下AI热潮下,最为受欢迎的开源框架.无论是从Github上的fork数量还是star数量,还是从支持的语音,开发资料,社区活跃度等多方面,他当之为superstar. 在前面介 ...
- Facebook提出DensePose数据集和网络架构:可实现实时的人体姿态估计
https://baijiahao.baidu.com/s?id=1591987712899539583 选自arXiv 作者:Rza Alp Güler, Natalia Neverova, Ias ...
- PCL学习(五)如何在mesh模型上sample更多点及三维物体姿态估计
---恢复内容开始--- 最近在做关于物体姿态估计的项目 基本思路就是 我们在估计物体的pose的时候,需要用分割得到的点云与模型库中的模型做匹配 1.通过基于RANSANC的SAC-IA将点云和模型 ...
- CVPR2020文章汇总 | 点云处理、三维重建、姿态估计、SLAM、3D数据集等(12篇)
作者:Tom Hardy Date:2020-04-15 来源:CVPR2020文章汇总 | 点云处理.三维重建.姿态估计.SLAM.3D数据集等(12篇) 1.PVN3D: A Deep Point ...
- CVPR 2020几篇论文内容点评:目标检测跟踪,人脸表情识别,姿态估计,实例分割等
CVPR 2020几篇论文内容点评:目标检测跟踪,人脸表情识别,姿态估计,实例分割等 CVPR 2020中选论文放榜后,最新开源项目合集也来了. 本届CPVR共接收6656篇论文,中选1470篇,&q ...
- 快速人体姿态估计:CVPR2019论文阅读
快速人体姿态估计:CVPR2019论文阅读 Fast Human Pose Estimation 论文链接: http://openaccess.thecvf.com/content_CVPR_201 ...
随机推荐
- 转:双向链表dblinklist
数据结构C#版笔记--双向链表(DbLinkList) 这是数据结构C#版笔记--线性表(Data Structure)之单链表(LinkList)的继续,对于双向链接,节点上除了Next属性外, ...
- 【转】Java学习---Java的锁和Mysql的锁机制
[原文]https://www.toutiao.com/i6593861446428262916/ Java和数据库的锁机制 https://www.toutiao.com/i659386144642 ...
- MySQL主从复制异步原理以及搭建
MySQL主从复制的原理: 1.首先,MySQL主库在事务提交时会把数据变更作为时间events记录在二进制日志文件binlog中:MySQL主库上的sync_binlog参数控制Binlog日志以什 ...
- 高斯消去、追赶法 matlab
1. 分别用Gauss消去法.列主元Gauss消去法.三角分解方法求解方程组 程序: (1)Guess消去法: function x=GaussXQByOrder(A,b) %Gauss消去法 N = ...
- burpsuite联合sqlmap扫描注入点
其实我们在众测的时候完全可以使用burpsuite联合sqlmap测试目标的注入漏洞.对get和post型注入都支持. 先来记录proxy的log , 记住路径 把proxy拦截关掉 接下来浏 ...
- eclipse 汉化详细方法
1.首先确认自己的 eclipse 是哪个版本,这个很关键,涉及到后面要用到的语言包需要与版本匹配,启动 eclipse,观察对应的版本号,比如我用的是 Photon 版本 2.参照官方给的方法进行下 ...
- Scala学习之路 (二)使用IDEA开发Scala
目前Scala的开发工具主要有两种:Eclipse和IDEA,这两个开发工具都有相应的Scala插件,如果使用Eclipse,直接到Scala官网下载即可http://scala-ide.org/do ...
- MP实战系列(十六)之性能分析插件
性能分析拦截器,用于输出每条 SQL 语句及其执行时间. 虽然使用阿里的Druid连接池可以完成这个目的,但是,我们一般认为,目前的组件能够达到这个目的,尽量使用目前的组件,因为修改配置和引入第三方库 ...
- WorldWind源码剖析系列:影像存储类ImageStore、Nlt影像存储类NltImageStore和WMS影像存储类WmsImageStore
影像存储类ImageStore 影像存储类ImageStore提供了计算本地影像路径和远程影像影像URL访问的各种接口,是WmsImageStore类和NltImageStore类的基类.当划分完层次 ...
- Python基础(9)——类
类的语法 类的定义 class Dog(object): print("hello,I am a dog!") d = Dog() #实例化这个类, #此时的d就是类Dog的实例化 ...