上一篇中已经读出了关节数据,这一次主要是在OpenCV中给各个关节点连线,绘制骨架图。
在上一篇中我们已经知道,关节点的位置信息是在CameraSpacePoint即摄像机空间坐标系中,要在OpenCV中显示的话,我们需要进行坐标转换,转换到深度空间坐标系或者彩色空间坐标系都可以,坐标转换完成之后就两个关节之间连线就可以。

代码如下:

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <Kinect.h>using namespace std;
using namespace cv;void DrawLine(Mat& Img, const Joint& r1, const Joint& r2, ICoordinateMapper* pMapper)
{//用两个关节点来做线段的两端,并且进行状态过滤if (r1.TrackingState == TrackingState_NotTracked || r2.TrackingState == TrackingState_NotTracked)return;//要把关节点用的摄像机坐标下的点转换成彩色空间的点ColorSpacePoint p1, p2;pMapper->MapCameraPointToColorSpace(r1.Position, &p1);pMapper->MapCameraPointToColorSpace(r2.Position, &p2);line(Img, Point(p1.X, p1.Y), Point(p2.X, p2.Y), Vec3b(0, 0, 255), 5);
}int main(void)
{// 1a. 获取传感器IKinectSensor* pSensor = nullptr;GetDefaultKinectSensor(&pSensor);// 1b. 打开传感器pSensor->Open();//******************* 2. 彩色图像读取到图像矩阵中******************IColorFrameSource* pFrameSource = nullptr;pSensor->get_ColorFrameSource(&pFrameSource);int     iWidth = 0, iHeight = 0;IFrameDescription* pFrameDescription = nullptr;pFrameSource->get_FrameDescription(&pFrameDescription);pFrameDescription->get_Width(&iWidth);pFrameDescription->get_Height(&iHeight);IColorFrameReader* pColorFrameReader = nullptr;pFrameSource->OpenReader(&pColorFrameReader);pFrameDescription->Release();pFrameDescription = nullptr;pFrameSource->Release();pFrameSource = nullptr;// Prepare OpenCV dataUINT uBufferSize = 0;Mat mColorImg (iHeight, iWidth, CV_8UC4);uBufferSize = iHeight * iWidth * 4 * sizeof(BYTE);// *******************3. 读取关节数据************************IBodyFrameReader* pBodyFrameReader = nullptr;IBody** aBodyData = nullptr;INT32 iBodyCount = 0;IBodyFrameSource* pBodySource = nullptr;pSensor->get_BodyFrameSource(&pBodySource);pBodySource->get_BodyCount(&iBodyCount);aBodyData = new IBody*[iBodyCount];for (int i = 0; i < iBodyCount; ++i)aBodyData[i] = nullptr;pBodySource->OpenReader(&pBodyFrameReader);pBodySource->Release();pBodySource = nullptr;// *************************4.准备坐标转换*************************ICoordinateMapper* pCoordinateMapper = nullptr;pSensor->get_CoordinateMapper(&pCoordinateMapper);namedWindow("Body Image");while (1){// 4a. 读取彩色图像并输出到矩阵IColorFrame* pColorFrame = nullptr;if (pColorFrameReader->AcquireLatestFrame(&pColorFrame) == S_OK){pColorFrame->CopyConvertedFrameDataToArray(uBufferSize, mColorImg.data, ColorImageFormat_Bgra);pColorFrame->Release();}//Mat mImg = mColorImg.clone();Mat mImg(iHeight, iWidth, CV_8UC4);;// 4b. 读取Body数据并输出到数组IBodyFrame* pBodyFrame = nullptr;if (pBodyFrameReader->AcquireLatestFrame(&pBodyFrame) == S_OK){// 4b1. 获取身体数据if (pBodyFrame->GetAndRefreshBodyData(iBodyCount, aBodyData) == S_OK){// 4b2. 遍历每个人for (int i = 0; i < iBodyCount; ++i){IBody* pBody = aBodyData[i];// 4b3. 确认追踪状态BOOLEAN bTracked = false;if ((pBody->get_IsTracked(&bTracked) == S_OK) && bTracked){// 4b4.获取关节Joint aJoints[JointType::JointType_Count];if (pBody->GetJoints(JointType::JointType_Count, aJoints) == S_OK){DrawLine(mImg, aJoints[JointType_SpineBase], aJoints[JointType_SpineMid], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_SpineMid], aJoints[JointType_SpineShoulder], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_SpineShoulder], aJoints[JointType_Neck], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_Neck], aJoints[JointType_Head], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_SpineShoulder], aJoints[JointType_ShoulderLeft], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_ShoulderLeft], aJoints[JointType_ElbowLeft], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_ElbowLeft], aJoints[JointType_WristLeft], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_WristLeft], aJoints[JointType_HandLeft], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_HandLeft], aJoints[JointType_HandTipLeft], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_HandLeft], aJoints[JointType_ThumbLeft], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_SpineShoulder], aJoints[JointType_ShoulderRight], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_ShoulderRight], aJoints[JointType_ElbowRight], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_ElbowRight], aJoints[JointType_WristRight], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_WristRight], aJoints[JointType_HandRight], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_HandRight], aJoints[JointType_HandTipRight], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_HandRight], aJoints[JointType_ThumbRight], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_SpineBase], aJoints[JointType_HipLeft], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_HipLeft], aJoints[JointType_KneeLeft], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_KneeLeft], aJoints[JointType_AnkleLeft], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_AnkleLeft], aJoints[JointType_FootLeft], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_SpineBase], aJoints[JointType_HipRight], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_HipRight], aJoints[JointType_KneeRight], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_KneeRight], aJoints[JointType_AnkleRight], pCoordinateMapper);DrawLine(mImg, aJoints[JointType_AnkleRight], aJoints[JointType_FootRight], pCoordinateMapper);}}}}else{cerr << "Can't read body data" << endl;}// 4e. 释放bodyframepBodyFrame->Release();}// 输出图像imshow("Body Image", mImg);if (waitKey(30) == VK_ESCAPE) {break;}}delete[] aBodyData;// 3.释放frame readercout << "Release body frame reader" << endl;pBodyFrameReader->Release();pBodyFrameReader = nullptr;// 2. 释放 color frame readercout << "Release color frame reader" << endl;pColorFrameReader->Release();pColorFrameReader = nullptr;// 1c.关闭Sensorcout << "close sensor" << endl;pSensor->Close();// 1d. 释放Sensorcout << "Release sensor" << endl;pSensor->Release();pSensor = nullptr;return 0;
}

Kinect V2开发(5)绘制骨架图相关推荐

  1. Kinect V2开发(5)读关节数据

    Kinect能取得Depth(物体与传感器的距离信息)和BodyIndex(人物索引),基于这些数据可以侦测到人体的骨骼信息并追踪,在Kinect V2的SDK 2.0中,它最多可以同时获取到6个人. ...

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

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

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

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

  4. kinect V2开发API

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

  5. 使用pykinect2+pyqt5开发kinect v2采集程序

    介绍 PyKinect2是一个将kinect api转化成python的程序,作者提供了例程,github地址,pyqt5是python版的QT,主要用来开发界面,本文利用两者开发kinect v2采 ...

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

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

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

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

  8. Kinect v2.0 for windows开发环境说明

    官方文档里是这些: Supported Operating Systems and Architectures The following operating systems and architec ...

  9. Kinect v2 Examples with-SDK 提示 技巧和示例简介

    原帖:https://rfilkov.com/2015/01/25/kinect-v2-tips-tricks-examples/#t26 所有在KinectScripts文件夹中管理的目的是什么: ...

最新文章

  1. 线段树 (经典题目合集)
  2. R语言xgboost包:使用xgboost算法实现随机森林(random forest)模型
  3. 华为emui10是鸿蒙,昨日,华为EMUI10,鸿蒙系统正式发布!
  4. 程序员职场的出路在哪里
  5. Fatal Python error: Cannot recover from stack overflow.(嵌套层数过多超出限制)
  6. MVP Community Camp 社区大课堂
  7. php获取邮箱内容吗,php正则验证email邮箱及抽取内容中email的例子
  8. 假如人类长出翅膀,会变成这种怪样子
  9. document.createElement
  10. 【报告分享】2022中国人工智能人才培养报告.pdf(附下载链接)
  11. Python用20行代码实现完整邮件功能 [完整代码+建议收藏]
  12. jquery中ajax应用——load()函数
  13. Nas性能测试工具-vdbench
  14. Ghost 系统安装全攻略图解(6种不同安装方法)
  15. 计算机制图作品答辩,工程制图(第一章)答辩.ppt
  16. 彩灯控制电路设计 -- 流水灯双花型(附Multisim)
  17. 物体成瘾性_如何克服数字成瘾和更多的意志力
  18. CE修改器入门:精确数值扫描
  19. 51CTO学院学习心得
  20. opencv生成棋盘格

热门文章

  1. Python中的AES加密
  2. 十二、Sequential
  3. java 正则 处理p标签
  4. 万向区块链实验室董事长肖风:区块链经济才是真正的共享经济
  5. MS17-010 Eternal Blue(永恒之蓝)”, 修复补丁下载汇总地址!
  6. 【JavaScript-动画原理】如何使用js进行动画效果的实现
  7. 丐丐-那些年青葱岁月
  8. 查找国际顶刊文献有哪些途径?
  9. Dota中卡尔技能总数的组合数量
  10. 一步一步学习Angular2(03.示例 MASTER/DETAIL)