# 简介
在上一篇[《侦测、追踪人体骨架》](http://www.cnblogs.com/xz816111/p/5187424.html)里,介绍了关节点的使用办法,这一篇记录将关节点与`OpenCV`结合的绘图方法。


代码

#include <iostream>
#include <opencv2\imgproc.hpp>
#include <opencv2\calib3d.hpp>
#include <opencv2\highgui.hpp>
#include <Kinect.h> using namespace std;
using namespace cv; void draw(Mat & img, Joint & r_1, Joint & r_2, ICoordinateMapper * myMapper);
int main(void)
{
IKinectSensor * mySensor = nullptr;
GetDefaultKinectSensor(&mySensor);
mySensor->Open(); IColorFrameSource * myColorSource = nullptr;
mySensor->get_ColorFrameSource(&myColorSource); IColorFrameReader * myColorReader = nullptr;
myColorSource->OpenReader(&myColorReader); int colorHeight = 0, colorWidth = 0;
IFrameDescription * myDescription = nullptr;
myColorSource->get_FrameDescription(&myDescription);
myDescription->get_Height(&colorHeight);
myDescription->get_Width(&colorWidth); IColorFrame * myColorFrame = nullptr;
Mat original(colorHeight, colorWidth, CV_8UC4); //**********************以上为ColorFrame的读取前准备************************** IBodyFrameSource * myBodySource = nullptr;
mySensor->get_BodyFrameSource(&myBodySource); IBodyFrameReader * myBodyReader = nullptr;
myBodySource->OpenReader(&myBodyReader); int myBodyCount = 0;
myBodySource->get_BodyCount(&myBodyCount); IBodyFrame * myBodyFrame = nullptr; ICoordinateMapper * myMapper = nullptr;
mySensor->get_CoordinateMapper(&myMapper); //**********************以上为BodyFrame以及Mapper的准备***********************
while (1)
{ while (myColorReader->AcquireLatestFrame(&myColorFrame) != S_OK);
myColorFrame->CopyConvertedFrameDataToArray(colorHeight * colorWidth * 4, original.data, ColorImageFormat_Bgra);
Mat copy = original.clone(); //读取彩色图像并输出到矩阵 while (myBodyReader->AcquireLatestFrame(&myBodyFrame) != S_OK); //读取身体图像
IBody ** myBodyArr = new IBody *[myBodyCount]; //为存身体数据的数组做准备
for (int i = 0; i < myBodyCount; i++)
myBodyArr[i] = nullptr; if (myBodyFrame->GetAndRefreshBodyData(myBodyCount, myBodyArr) == S_OK) //把身体数据输入数组
for (int i = 0; i < myBodyCount; i++)
{
BOOLEAN result = false;
if (myBodyArr[i]->get_IsTracked(&result) == S_OK && result) //先判断是否侦测到
{
Joint myJointArr[JointType_Count];
if (myBodyArr[i]->GetJoints(JointType_Count, myJointArr) == S_OK) //如果侦测到就把关节数据输入到数组并画图
{
draw(copy, myJointArr[JointType_Head], myJointArr[JointType_Neck], myMapper);
draw(copy, myJointArr[JointType_Neck], myJointArr[JointType_SpineShoulder], myMapper); draw(copy, myJointArr[JointType_SpineShoulder], myJointArr[JointType_ShoulderLeft], myMapper);
draw(copy, myJointArr[JointType_SpineShoulder], myJointArr[JointType_SpineMid], myMapper);
draw(copy, myJointArr[JointType_SpineShoulder], myJointArr[JointType_ShoulderRight], myMapper); draw(copy, myJointArr[JointType_ShoulderLeft], myJointArr[JointType_ElbowLeft], myMapper);
draw(copy, myJointArr[JointType_SpineMid], myJointArr[JointType_SpineBase], myMapper);
draw(copy, myJointArr[JointType_ShoulderRight], myJointArr[JointType_ElbowRight], myMapper); draw(copy, myJointArr[JointType_ElbowLeft], myJointArr[JointType_WristLeft], myMapper);
draw(copy, myJointArr[JointType_SpineBase], myJointArr[JointType_HipLeft], myMapper);
draw(copy, myJointArr[JointType_SpineBase], myJointArr[JointType_HipRight], myMapper);
draw(copy, myJointArr[JointType_ElbowRight], myJointArr[JointType_WristRight], myMapper); draw(copy, myJointArr[JointType_WristLeft], myJointArr[JointType_ThumbLeft], myMapper);
draw(copy, myJointArr[JointType_WristLeft], myJointArr[JointType_HandLeft], myMapper);
draw(copy, myJointArr[JointType_HipLeft], myJointArr[JointType_KneeLeft], myMapper);
draw(copy, myJointArr[JointType_HipRight], myJointArr[JointType_KneeRight], myMapper);
draw(copy, myJointArr[JointType_WristRight], myJointArr[JointType_ThumbRight], myMapper);
draw(copy, myJointArr[JointType_WristRight], myJointArr[JointType_HandRight], myMapper); draw(copy, myJointArr[JointType_HandLeft], myJointArr[JointType_HandTipLeft], myMapper);
draw(copy, myJointArr[JointType_KneeLeft], myJointArr[JointType_FootLeft], myMapper);
draw(copy, myJointArr[JointType_KneeRight], myJointArr[JointType_FootRight], myMapper);
draw(copy, myJointArr[JointType_HandRight], myJointArr[JointType_HandTipRight], myMapper);
}
}
}
delete[]myBodyArr;
myBodyFrame->Release();
myColorFrame->Release(); imshow("TEST", copy);
if (waitKey(30) == VK_ESCAPE)
break;
}
myMapper->Release(); myDescription->Release();
myColorReader->Release();
myColorSource->Release(); myBodyReader->Release();
myBodySource->Release();
mySensor->Close();
mySensor->Release(); return 0;
} void draw(Mat & img, Joint & r_1, Joint & r_2, ICoordinateMapper * myMapper)
{
//用两个关节点来做线段的两端,并且进行状态过滤
if (r_1.TrackingState == TrackingState_Tracked && r_2.TrackingState == TrackingState_Tracked)
{
ColorSpacePoint t_point; //要把关节点用的摄像机坐标下的点转换成彩色空间的点
Point p_1, p_2;
myMapper->MapCameraPointToColorSpace(r_1.Position, &t_point);
p_1.x = t_point.X;
p_1.y = t_point.Y;
myMapper->MapCameraPointToColorSpace(r_2.Position, &t_point);
p_2.x = t_point.X;
p_2.y = t_point.Y; line(img, p_1, p_2, Vec3b(0, 255, 0), 5);
circle(img, p_1, 10, Vec3b(255, 0, 0), -1);
circle(img, p_2, 10, Vec3b(255, 0, 0), -1);
}
}

详细说明

不难发现代码跟前面一篇非常类似,不同的地方就在于绘图部分。首先要将关节点用的CameraSpace转换到ColorSpace,这一操作可以借助ICoordinateMapper完成,然后就用两个关节点来作为线段的两端画线。这里采用了广度优先的办法,从上到下一层一层选取关节点。


效果图

最新文章

  1. LeetCode House Robber III
  2. Python中MySQLdb模块的安装
  3. java集合类的学习(二)
  4. log file switch (checkpoint incomplete)
  5. ServletContext2
  6. ORACLE 更新关联多张表
  7. jQuery按钮复制文本内容
  8. Spring配置文件模板
  9. Eclipse添加和查看书签
  10. Loadrunner脚本录制注意事项(七)
  11. eclipse 项目引入第三方jar包 3种方法
  12. 高并发WEB网站优化方案
  13. CopyOnWriteArrayList源码解析
  14. min_25筛
  15. 中文乱码总结之JSP乱码
  16. 为什么做java开发的公司需要那么多程序员?
  17. 纯手工编写的PE可执行程序
  18. 高质量PHP代码的50个实用技巧:非常值得收藏
  19. appium API接口
  20. python删除列表元素remove,pop,del

热门文章

  1. android获取手机的所有通讯录的号码和sim卡号码
  2. 转载:你可能没注意的CSS单位
  3. Java工具类 Apache Commons:commons-lang
  4. Oracle和plsql developer编码设置
  5. &lt;meta http-equiv = &quot;X-UA-Compatible&quot; cotent = &quot;IE=edge,chrome=1&quot;/&gt;
  6. JDK - Tomcat - Eclipse - JSP - Servlet 配置运行全攻略
  7. 浅析jQuery框架与构造对象
  8. 实战项目:通过当当API将订单抓取到SAP(一)
  9. PHP对大小写敏感问题的处理比较乱,写代码时可能偶尔出问题,所以这里总结一下。以便用到的出现错误
  10. 【JS】defer / async