kinect读取人体骨骼点数据
来源:互联网 发布:淘宝网付费推广有哪些 编辑:程序博客网 时间:2024/04/29 12:30
上一篇博文中实现了通过kinect读取深度图像以及彩色图像,今天使用kinect获取了人体的骨骼点数据,但读取骨骼点数据的程序运行需要的时间比获取深度图像要久,起初以为是代码出了问题,但等待较长一段时间后发现程序是好的,而且需要站在一米多的地方能够清晰的读取人体的骨骼点数据,实时性也还可以,主要参考如下这篇博主的博文:http://blog.csdn.net/zouxy09/article/details/8161617。
#include <windows.h> #include <iostream> #include <NuiApi.h> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; //通过传入关节点的位置,把骨骼画出来 void drawSkeleton(Mat &image, CvPoint pointSet[], int whichone); int main(int argc, char *argv[]) { Mat skeletonImage; skeletonImage.create(240, 320, CV_8UC3); CvPoint skeletonPoint[NUI_SKELETON_COUNT][NUI_SKELETON_POSITION_COUNT]={cvPoint(0,0)}; bool tracked[NUI_SKELETON_COUNT]={FALSE}; //1、初始化NUI,注意这里是USES_SKELETON HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_SKELETON); if (FAILED(hr)) { cout<<"NuiInitialize failed"<<endl; return hr; } //2、定义骨骼信号事件句柄 HANDLE skeletonEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); //3、打开骨骼跟踪事件 hr = NuiSkeletonTrackingEnable( skeletonEvent, 0 ); if( FAILED( hr ) ) { cout<<"Could not open color image stream video"<<endl; NuiShutdown(); return hr; } namedWindow("skeletonImage", CV_WINDOW_AUTOSIZE); //4、开始读取骨骼跟踪数据 while(1) { NUI_SKELETON_FRAME skeletonFrame = {0}; //骨骼帧的定义 bool bFoundSkeleton = false; //4.1、无限等待新的数据,等到后返回 if (WaitForSingleObject(skeletonEvent, INFINITE)==0) { //4.2、从刚才打开数据流的流句柄中得到该帧数据,读取到的数据地址存于skeletonFrame hr = NuiSkeletonGetNextFrame( 0, &skeletonFrame); if (SUCCEEDED(hr)) { //NUI_SKELETON_COUNT是检测到的骨骼数(即,跟踪到的人数) for( int i = 0 ; i < NUI_SKELETON_COUNT ; i++ ) { NUI_SKELETON_TRACKING_STATE trackingState = skeletonFrame.SkeletonData[i].eTrackingState; //4.3、Kinect最多检测六个人,但只能跟踪两个人的骨骼,再检查每个“人”(有可能是空,不是人) //是否跟踪到了 if( trackingState == NUI_SKELETON_TRACKED ) { bFoundSkeleton = true; } } } if( !bFoundSkeleton ) { continue; } //4.4、平滑骨骼帧,消除抖动 NuiTransformSmooth(&skeletonFrame, NULL); skeletonImage.setTo(0); for( int i = 0 ; i < NUI_SKELETON_COUNT ; i++ ) { // Show skeleton only if it is tracked, and the center-shoulder joint is at least inferred. //断定是否是一个正确骨骼的条件:骨骼被跟踪到并且肩部中心(颈部位置)必须跟踪到。 if( skeletonFrame.SkeletonData[i].eTrackingState == NUI_SKELETON_TRACKED && skeletonFrame.SkeletonData[i].eSkeletonPositionTrackingState[NUI_SKELETON_POSITION_SHOULDER_CENTER] != NUI_SKELETON_POSITION_NOT_TRACKED) { float fx, fy; //拿到所有跟踪到的关节点的坐标,并转换为我们的深度空间的坐标,因为我们是在深度图像中 //把这些关节点标记出来的 //NUI_SKELETON_POSITION_COUNT为跟踪到的一个骨骼的关节点的数目,为20 for (int j = 0; j < NUI_SKELETON_POSITION_COUNT; j++) { NuiTransformSkeletonToDepthImage(skeletonFrame.SkeletonData[i].SkeletonPositions[j], &fx, &fy ); skeletonPoint[i][j].x = (int)fx; skeletonPoint[i][j].y = (int)fy; } for (int j=0; j<NUI_SKELETON_POSITION_COUNT ; j++) { if (skeletonFrame.SkeletonData[i].eSkeletonPositionTrackingState[j] != NUI_SKELETON_POSITION_NOT_TRACKED)//跟踪点一用有三种状态:1没有被跟踪到,2跟踪到,3根据跟踪到的估计到 { circle(skeletonImage, skeletonPoint[i][j], 3, cvScalar(0, 255, 255), 1, 8, 0); tracked[i] = TRUE; } } drawSkeleton(skeletonImage, skeletonPoint[i], i); } } imshow("skeletonImage", skeletonImage); //显示图像 } else { cout<<"Buffer length of received texture is bogus\r\n"<<endl; } if (cvWaitKey(20) == 27) break; } //5、关闭NUI链接 NuiShutdown(); return 0; } //通过传入关节点的位置,把骨骼画出来 void drawSkeleton(Mat &image, CvPoint pointSet[], int whichone) { CvScalar color; switch(whichone) //跟踪不同的人显示不同的颜色 { case 0: color = cvScalar(255); break; case 1: color = cvScalar(0,255); break; case 2: color = cvScalar(0, 0, 255); break; case 3: color = cvScalar(255, 255, 0); break; case 4: color = cvScalar(255, 0, 255); break; case 5: color = cvScalar(0, 255, 255); break; } if((pointSet[NUI_SKELETON_POSITION_HEAD].x!=0 || pointSet[NUI_SKELETON_POSITION_HEAD].y!=0) && (pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER].x!=0 || pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_HEAD], pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER], color, 2); if((pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER].x!=0 || pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER].y!=0) && (pointSet[NUI_SKELETON_POSITION_SPINE].x!=0 || pointSet[NUI_SKELETON_POSITION_SPINE].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER], pointSet[NUI_SKELETON_POSITION_SPINE], color, 2); if((pointSet[NUI_SKELETON_POSITION_SPINE].x!=0 || pointSet[NUI_SKELETON_POSITION_SPINE].y!=0) && (pointSet[NUI_SKELETON_POSITION_HIP_CENTER].x!=0 || pointSet[NUI_SKELETON_POSITION_HIP_CENTER].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_SPINE], pointSet[NUI_SKELETON_POSITION_HIP_CENTER], color, 2); //左上肢 if((pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER].x!=0 || pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER].y!=0) && (pointSet[NUI_SKELETON_POSITION_SHOULDER_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_SHOULDER_LEFT].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER], pointSet[NUI_SKELETON_POSITION_SHOULDER_LEFT], color, 2); if((pointSet[NUI_SKELETON_POSITION_SHOULDER_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_SHOULDER_LEFT].y!=0) && (pointSet[NUI_SKELETON_POSITION_ELBOW_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_ELBOW_LEFT].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_SHOULDER_LEFT], pointSet[NUI_SKELETON_POSITION_ELBOW_LEFT], color, 2); if((pointSet[NUI_SKELETON_POSITION_ELBOW_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_ELBOW_LEFT].y!=0) && (pointSet[NUI_SKELETON_POSITION_WRIST_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_WRIST_LEFT].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_ELBOW_LEFT], pointSet[NUI_SKELETON_POSITION_WRIST_LEFT], color, 2); if((pointSet[NUI_SKELETON_POSITION_WRIST_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_WRIST_LEFT].y!=0) && (pointSet[NUI_SKELETON_POSITION_HAND_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_HAND_LEFT].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_WRIST_LEFT], pointSet[NUI_SKELETON_POSITION_HAND_LEFT], color, 2); //右上肢 if((pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER].x!=0 || pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER].y!=0) && (pointSet[NUI_SKELETON_POSITION_SHOULDER_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_SHOULDER_RIGHT].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_SHOULDER_CENTER], pointSet[NUI_SKELETON_POSITION_SHOULDER_RIGHT], color, 2); if((pointSet[NUI_SKELETON_POSITION_SHOULDER_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_SHOULDER_RIGHT].y!=0) && (pointSet[NUI_SKELETON_POSITION_ELBOW_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_ELBOW_RIGHT].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_SHOULDER_RIGHT], pointSet[NUI_SKELETON_POSITION_ELBOW_RIGHT], color, 2); if((pointSet[NUI_SKELETON_POSITION_ELBOW_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_ELBOW_RIGHT].y!=0) && (pointSet[NUI_SKELETON_POSITION_WRIST_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_WRIST_RIGHT].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_ELBOW_RIGHT], pointSet[NUI_SKELETON_POSITION_WRIST_RIGHT], color, 2); if((pointSet[NUI_SKELETON_POSITION_WRIST_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_WRIST_RIGHT].y!=0) && (pointSet[NUI_SKELETON_POSITION_HAND_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_HAND_RIGHT].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_WRIST_RIGHT], pointSet[NUI_SKELETON_POSITION_HAND_RIGHT], color, 2); //左下肢 if((pointSet[NUI_SKELETON_POSITION_HIP_CENTER].x!=0 || pointSet[NUI_SKELETON_POSITION_HIP_CENTER].y!=0) && (pointSet[NUI_SKELETON_POSITION_HIP_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_HIP_LEFT].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_HIP_CENTER], pointSet[NUI_SKELETON_POSITION_HIP_LEFT], color, 2); if((pointSet[NUI_SKELETON_POSITION_HIP_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_HIP_LEFT].y!=0) && (pointSet[NUI_SKELETON_POSITION_KNEE_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_KNEE_LEFT].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_HIP_LEFT], pointSet[NUI_SKELETON_POSITION_KNEE_LEFT], color, 2); if((pointSet[NUI_SKELETON_POSITION_KNEE_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_KNEE_LEFT].y!=0) && (pointSet[NUI_SKELETON_POSITION_ANKLE_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_ANKLE_LEFT].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_KNEE_LEFT], pointSet[NUI_SKELETON_POSITION_ANKLE_LEFT], color, 2); if((pointSet[NUI_SKELETON_POSITION_ANKLE_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_ANKLE_LEFT].y!=0) && (pointSet[NUI_SKELETON_POSITION_FOOT_LEFT].x!=0 || pointSet[NUI_SKELETON_POSITION_FOOT_LEFT].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_ANKLE_LEFT], pointSet[NUI_SKELETON_POSITION_FOOT_LEFT], color, 2); //右下肢 if((pointSet[NUI_SKELETON_POSITION_HIP_CENTER].x!=0 || pointSet[NUI_SKELETON_POSITION_HIP_CENTER].y!=0) && (pointSet[NUI_SKELETON_POSITION_HIP_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_HIP_RIGHT].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_HIP_CENTER], pointSet[NUI_SKELETON_POSITION_HIP_RIGHT], color, 2); if((pointSet[NUI_SKELETON_POSITION_HIP_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_HIP_RIGHT].y!=0) && (pointSet[NUI_SKELETON_POSITION_KNEE_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_KNEE_RIGHT].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_HIP_RIGHT], pointSet[NUI_SKELETON_POSITION_KNEE_RIGHT],color, 2); if((pointSet[NUI_SKELETON_POSITION_KNEE_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_KNEE_RIGHT].y!=0) && (pointSet[NUI_SKELETON_POSITION_ANKLE_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_ANKLE_RIGHT].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_KNEE_RIGHT], pointSet[NUI_SKELETON_POSITION_ANKLE_RIGHT], color, 2); if((pointSet[NUI_SKELETON_POSITION_ANKLE_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_ANKLE_RIGHT].y!=0) && (pointSet[NUI_SKELETON_POSITION_FOOT_RIGHT].x!=0 || pointSet[NUI_SKELETON_POSITION_FOOT_RIGHT].y!=0)) line(image, pointSet[NUI_SKELETON_POSITION_ANKLE_RIGHT], pointSet[NUI_SKELETON_POSITION_FOOT_RIGHT], color, 2); }
阅读全文
0 0
- kinect读取人体骨骼点数据
- kinect读取骨骼点数据(二)
- 读取AI Challenger比赛人体骨骼关键点Json数据和场景分类Json数据
- 人体骨骼关键点检测
- Kinect提取骨骼数据---新版本
- windows下用kinect V2 识别人体骨骼
- Kinect骨骼关节数据的获取
- KINECT同时提取六人骨骼数据
- Kinect 骨骼追踪数据的处理方法
- AI Challenger-人体骨骼关键点检测&& Human Pose Estimation
- kinect深度数据读取
- Kinect+OpenNI学习笔记(不需要骨骼跟踪的人体手部分割)
- kinect获取的20个骨骼点坐标
- Kinect V2开发(7)测量骨骼点高度以及骨骼角度
- Kinect API 自带骨骼数据平滑处理
- Kinect V2开发(6)骨骼数据平滑处理
- Kinect .ply数据读取、可视化
- Ros kinect点云数据
- hive修改表和字段注释
- [Webservice] Eclipse根据wsdl文件自动生成webservice的调用客户端
- PAT_1090. Highest Price in Supply Chain
- wpf自定义colorpicker
- 罗塞塔一遍总结
- kinect读取人体骨骼点数据
- Hbase完全分布式集群安装配置(Hbase1.0.0,Hadoop2.6.0)
- PAT 1056. Mice and Rice (25)
- 转载:求职防骗指南
- python_集合
- 进程间通信和线程间通信总结
- 转载pca的数学原理(看别人转载的格式不太好看,就自己转一下,经典保留)
- 十一、select2实现下拉菜单
- 使用java 8 Optional 的正确姿势