Kinect能取得Depth(物体与传感器的距离信息)和BodyIndex(人物索引),基于这些数据可以侦测到人体的骨骼信息并追踪,在Kinect V2的SDK 2.0中,它最多可以同时获取到6个人、每个人25个关节点的信息,并且通过深度摄像头,可以同时获取到这些关节点的坐标。此时的坐标使用的是Camera Space,也就是摄像机空间坐标系,代表了物体距离深度摄像头的距离。
Kinect的人体姿势,是向学习了基于庞大数量的姿势信息的识别器里,输入人体区域的信息来推定的(注:因为男女老少高矮胖瘦体形各不相同,所以必须基于神经网络的数据库才能准确识别人体)。这个技术出自微软在IEEE CVPR 2011(计算机视觉及模式认识领域的首位会议)发表,获奖Best Paper。
Microsoft ResearchReal-Time Human Pose Recognition in Parts from a Single Depth Image
文章我正在读,之后有时间会传一篇阅读笔记。

要读取骨骼数据,前面的步骤和之前一样,要先通过IKinectSensor来取得 IBodyFrameSource,然后开启 IBodyFrameReader,之后再在主循环里取得 IBodyFrame里面的数据,但是在IBodyFrame里面实际上包括了所有人的数据,需要通过GetAndRefreshBodyData()这个函数写入IBody这个类里面再进行个别读取。可以另外设置一个变量代表一个IBody阵列,写入数据后即可以读取每个人的骨架资料。
通过IBodyFrameSourceget_BodyCount() 可以取得iBodyCount 代表可以读取到追踪的人数,目前来说最多就是6个人。

通过IBody中的get_IsTracked()这个函数可以判断某个人是否正在被追踪

通过IBody中的GetJoints()这个函数可以得到所有关节点的位置信息。

位置信息被定义成Joint这个类别,里面包含三个参数,第一个是JointType,代表是哪个关节点,我们可以在JointType Enumeration中看到具体的列举;第二个是Position,是用CameraSpacePoint 来记录这个关节点在摄像头空间坐标系里的位置(如果要用来在2D图像中显示,需要做坐标转换);第三个是TrackingState,用来记录这个关节的追踪状态。

通过IBody中的GetJointOrientations()这个函数可以得到关节点的方向

IBody中还有两个函数get_HandRightState()get_HandLeftState() 可以用来获取两手的状态数据。
我做了一个上半身骨骼信息读取,效果图如下:

用户编号是看起来是随机的,我自己测试的时候每一次编号都不太一样,但是在0-5范围,位置变化的时候不一定能读取到几个关节,离Kinect比较近的话只能读到一个关节。然后这个位置和方向的数据是读出来了,但是是否正确还不知道怎么验证。
代码如下:

#include <iostream>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <Kinect.h>using namespace std;
using namespace cv;const   string  get_name(int n);    //此函数判断出关节点的名字int main(void)
{// 1a.获取感应器IKinectSensor* pSensor = nullptr;GetDefaultKinectSensor(&pSensor);// 1b. 打开感应器pSensor->Open();/****************2.打开深度图像阅读器************************/// 取得深度数据IDepthFrameSource* pDepthSource = nullptr;pSensor->get_DepthFrameSource(&pDepthSource);// 取得深度数据的描述信息(宽、高)int        iDepthWidth = 0;int        iDepthHeight = 0;IFrameDescription* pDepthDescription = nullptr;pDepthSource->get_FrameDescription(&pDepthDescription);pDepthDescription->get_Width(&iDepthWidth);pDepthDescription->get_Height(&iDepthHeight);// 打开深度数据阅读器IDepthFrameReader* pDepthReader = nullptr;pDepthSource->OpenReader(&pDepthReader);pDepthDescription->Release();pDepthDescription = nullptr;// 释放变量pDepthSourcepDepthSource->Release();pDepthSource = nullptr;/*******************3.打开Body数据的阅读器*******************/// 取得Body数据IBodyFrameSource* pBodySource = nullptr;pSensor->get_BodyFrameSource(&pBodySource);// 取得Body数据的描述信息(数量)int        iBodyCount = 0;pBodySource->get_BodyCount(&iBodyCount);IBody** aBody = new IBody*[iBodyCount];for (int i = 0; i < iBodyCount; ++i)aBody[i] = nullptr;// 打开Body数据阅读器IBodyFrameReader* pBodyReader = nullptr;pBodySource->OpenReader(&pBodyReader);// 释放变量pBodySourcepBodySource->Release();pBodySource = nullptr;/*******************4.为显示深度图像做准备******************/Mat img16(iDepthHeight, iDepthWidth, CV_16UC1);Mat img8(iDepthHeight, iDepthWidth, CV_8UC1);while (1){// 4a. 深度图像的转化以及显示IDepthFrame * pDepthFrame = nullptr;while (pDepthReader->AcquireLatestFrame(&pDepthFrame) != S_OK);pDepthFrame->CopyFrameDataToArray(iDepthWidth * iDepthHeight, (UINT16 *)img16.data);img16.convertTo(img8, CV_8UC1, 255.0 / 4500);imshow("Depth Img", img8);// 4b. 获取Body数据IBodyFrame* pBodyFrame = nullptr;while (pBodyReader->AcquireLatestFrame(&pBodyFrame) != S_OK);if (pBodyFrame->GetAndRefreshBodyData(iBodyCount, aBody) == S_OK){int iTrackedBodyCount = 0;// 4c. 遍历每个人for (int i = 0; i < iBodyCount; ++i){IBody* pBody = aBody[i];// 判断这个人是不是正在被追踪BOOLEAN bTracked = false;if ((pBody->get_IsTracked(&bTracked) == S_OK) && bTracked){++iTrackedBodyCount;cout << "User " << i << " is under tracking!" << endl;// 获取关节位置int count = 0;Joint aJoints[JointType::JointType_Count];if (pBody->GetJoints(JointType::JointType_Count, aJoints) != S_OK){cerr << "Get joints fail" << endl;}// 获取关节方向JointOrientation aOrientations[JointType::JointType_Count];if (pBody->GetJointOrientations(JointType::JointType_Count, aOrientations) != S_OK){cerr << "Get joints fail" << endl;}// 输出信息for (int j = 0; j < JointType_Count; j++){//判断该点是否被追踪if (aJoints[j].TrackingState == TrackingState_Tracked)continue;//获取关节的名字string rt = get_name(aJoints[j].JointType);//输出关节信息if (rt != "NULL"){count++;cout << "   " << rt << "  tracked" << endl;cout << "\n\t position: " << aJoints[j].Position.X <<"," << aJoints[j].Position.Y << "," << aJoints[j].Position.Z<< "\n\t orientation: " << aOrientations[j].Orientation.w<< ","<< aOrientations[j].Orientation.x << "," << aOrientations[j].Orientation.y << "," << aOrientations[j].Orientation.z <<endl;}}cout << count << "joints tracked" << endl << endl;}}//判断这一时刻有几个人在被追踪if (iTrackedBodyCount > 0)cout << "Total " << iTrackedBodyCount << " bodies in this time\n" << endl;else{cerr << "Can't read body data" << endl;}}// 4d. release framepDepthFrame->Release();pBodyFrame->Release();if (waitKey(30) == VK_ESCAPE)break;//为避免数据刷太快,每秒钟更新一次Sleep(1000);    }delete[] aBody;// 4e. release framepDepthReader->Release();pBodyReader->Release();// 1c.关闭感应器pSensor->Close();// 1d.释放感应器pSensor->Release();pSensor = nullptr;return 0;
}const   string  get_name(int n)
{switch (n){case    2:return    "Neck"; break;case    3:return    "Head"; break;case    4:return    "Left shoulder"; break;case    8:return    "Right shoulder"; break;case    7:return    "Left hand"; break;case    11:return   "Right hand"; break;case    22:return   "Left thumb"; break;case    24:return   "Right thumb"; break;default :return "NULL";}
}

Kinect V2开发(5)读关节数据相关推荐

  1. Kinect V2开发(5)绘制骨架图

    上一篇中已经读出了关节数据,这一次主要是在OpenCV中给各个关节点连线,绘制骨架图. 在上一篇中我们已经知道,关节点的位置信息是在CameraSpacePoint即摄像机空间坐标系中,要在OpenC ...

  2. Kinect入门介绍---Kinect V2开发学习(1)

    Kinect 传感器的工作原理 Kinect 传感器是美国微软公司 2010 年推出的一款体态感知设备,它不需要用借助任何手柄之类的控制即可完成人与机器的交流,它一经面世便成为了研究的热门.该传感器的 ...

  3. ROS 环境下 Kinect V2 开发(4) —— NiTE2 的配置

    平台环境 Ubuntu14.04 32位 ROS indigo 处理器:Inter(R) Celeron(R) CPU N3160 @ 1.60GHz x 4 libfreenect2 驱动 iai_ ...

  4. kinect V2开发API

    引言 记录在开发的时候,常用的一些接口含义. 开发API 数据类型 Frame 数据类型 bodyFrame 骨骼数据 infraredFrame 红外数据 depthFrame 景深数据 color ...

  5. Kinect v1和Kinect v2的彻底比较

    本连载主要是比较Kinect for Windows的现行版(v1)和次世代型的开发者预览版(v2),以C++开发者为背景介绍进化的硬件和软件.本文主要是对传感的配置和运行条件进行彻底的比较. 本连载 ...

  6. 深度相机(五)--Kinect v2.0

    原文:http://blog.csdn.net/qq1175421841/article/details/50412994 ----微软Build2012大会:Kinect for Windows P ...

  7. Unity体感应用开发——Kinect V2 抠像

    硬件.SDK.插件准备见这个文章: Unity体感应用开发--Kinect V2 获取彩色摄像头数据 抠像,英文叫BackgroundRemoval.即背景移除.在SDK Browser的demo里面 ...

  8. Kinect For Windows V2开发日志九:侦测并绘制人体骨架

    简介 在上一篇<侦测.追踪人体骨架>里,介绍了关节点的使用办法,这一篇记录将关节点与OpenCV结合的绘图方法. 代码 #include <iostream> #include ...

  9. Kinect For Windows V2开发日志一:开发环境的配置

    算是正式进军Kinect了,前段时间学的东西现在就忘了,于是从此开始记录一下. 目前为止大部分的学习资料来自于Heresy的博客,写的非常优秀,清晰明了,十分感谢.开发语言为C++,应该会一直使用,但 ...

最新文章

  1. Windows Phone实用开发技巧(1):保存图片及加载图片
  2. python做运动控制_ROS探索总结-61.MoveIt!编程驾驭机械臂运动控制
  3. taro 小程序转h5之后报错_记录微信小程序转Taro中遇到的问题
  4. 答题闯关php,成语答题闯关红包流量主小程序源码
  5. Javascript--Folder对象
  6. Rwordseg安装
  7. Angualr8 ViewChild报错
  8. OpenStack 云计算基础知识
  9. ElementUI-自定义模板包含编辑与删除的功能
  10. 记录android离屏渲染的一些资料
  11. iOS 开发 初级:应用内购买 In-App Purchase
  12. c# rar解压大小_C# 利用WinRAR (加密)压缩及解压缩
  13. Android项目实战系列—基于博学谷(一)项目综述
  14. 计算机软硬件故障排除知识,计算机软硬件基础知识及常见故障排除方法
  15. 浙大PAT练习题1006
  16. 计算机设计大赛海报素材,海报创意设计比赛方案(word版)
  17. Arcgis使用教程(十)ARCGIS地图制图之基于颜色搭配器的地图颜色配色
  18. c语言 char = china,[求助]char a []=CHINA
  19. 昵图网共享分下载代包下素材nipic呢图下载币图网设计素材下载
  20. 量子计算机九章感想,量子计算机九章这么火,本文让你明白什么是量子

热门文章

  1. 1147. 西佳佳偶像天团1
  2. 经美国海外投资委员会批准,韩华Systems向Kymeta Corporation投资3,000万美元
  3. .net中当Thread.Sleep和Application.DoEvents都不好用时
  4. IM即时通讯-7-如何设计通知提醒
  5. Http、Https协议详解
  6. Javaswing界面设计拖动
  7. 寒门学子的奋斗史(三) —— 走进大城市
  8. 软件工程师周兆熊给IT学子的倾情奉献
  9. 详述properties文件
  10. vue如何默认选中单选框