Win10~KinectV1开发
开发环境
Win10
VS2019
KinectV1
一、Kinect环境搭建
kinect开发环境搭建——VS2017+kinect1.0+opencv3.4.1
二、OpenCV配置
Windows10~VS2019~OpenCV3.4.6配置
三、KinectV1测试代码
Kinect开发学习笔记之(七)骨骼数据的提取
#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_SKELETONHRESULT 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、从刚才打开数据流的流句柄中得到该帧数据,读取到的数据地址存于skeletonFramehr = 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为跟踪到的一个骨骼的关节点的数目,为20for (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); }
Win10~KinectV1开发相关推荐
- win10应用开发——如何判断应用是在手机上运行还是电脑上运行
原文:win10应用开发--如何判断应用是在手机上运行还是电脑上运行 在进行uwp应用开发的时候, 有时我们需要知道自己的应用是在手机端运行还是在桌面端运行,那么通过以下的api就可以进行判断: Wi ...
- Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App
安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...
- Win10 UWP开发中的重复性静态UI绘制小技巧 1
Win10 UWP开发中的重复性静态UI绘制小技巧 1 原文:Win10 UWP开发中的重复性静态UI绘制小技巧 1 介绍 在Windows 10 UWP界面实现的过程中,有时会遇到一些重复性的.静态 ...
- uwp post php,window_Win10开发系列专题五 UWP应用添加画布及语音输入支持,这是微软Win10十个开发系列专 - phpStudy...
Win10开发系列专题五 UWP应用添加画布及语音输入支持 这是微软Win10十个开发系列专题的第五期内容,本期微软讲解了为Windows10 UWP应用添加画布/数字墨水书写及语音输入支持的方法.微 ...
- 【Win10 应用开发】扫描和连接Wi-fi网络
原文:[Win10 应用开发]扫描和连接Wi-fi网络 老周今天带大家去"扫雷"了,别当真,是扫描并连接指定无线网络,时尚一点叫Wi-fi. 所以,今天的任务要求你的设备至少有1张 ...
- 【Win10应用开发】自定义磁贴通知的排版
[Win10应用开发]自定义磁贴通知的排版 原文:[Win10应用开发]自定义磁贴通知的排版 前面老周用了两篇烂文,向大家介绍了Adaptive磁贴的模板使用.那些XML模板已经很强大了,不过,如果你 ...
- 在win10本地开发springboot项目能上传图片,并能通过URL直接从浏览器访问,但是部署到服务器上后能上传文件,但是通过浏览器无法访问图片
在win10本地开发springboot项目能上传图片,并能通过URL直接从浏览器访问,但是部署到服务器上后能上传文件,但是通过浏览器无法访问图片 1.首先springboot项目在Window和Li ...
- win10后端开发环境搭建
win10后端开发环境搭建 jdk 下载 配置环境变量 验证 maven 下载 配置环境变量 验证 修改远程仓库和本地仓库 验证远程仓库与本地仓库设置成功 git nodejs 配置环境变量 测试 m ...
- “Win10 UAP 开发系列”之主题模式切换
原文:"Win10 UAP 开发系列"之主题模式切换 微软动作真是快,本来想写WP8.1RT系列,结果刚整理了一点就出Win10 UAP了.不过还好RT到Win10的差别还不算太大 ...
最新文章
- 新一代人工智能白皮书(2020年) ——产业智能化升级
- 性能测试之开源的性能监控软件
- java自学手记——继承
- ajax php 区别,PHP中AJAX比较(转)
- 视频直播点播nginx-rtmp开发手册中文版
- 为什么在Linux执行自己的程序要在前面加./
- 详细Ubuntu桥接模式网络配置过程
- 《最优化理论》:运输问题(一)求最小运费【西北角法、最小元素法、伏格尔法】
- 三星专用计算机软件,三星PC套件Kies软件
- 如何下载centos7的iso文件
- Metasploit攻击winserver2008实例
- 某移动版网页源码留存
- ORACLE 19c via Docker on Mac安装教程客户端配置连接Navicat GUI
- KKT条件的物理意义(转)
- NameNode故障处理方法
- for循环遍历字符串
- 从西安到深圳——一路向南
- c++中的fork函数_fork函数
- 曝光房屋租售合同诈骗6手段~~!!!!大家注意了·~~~
- Unity 5.4+版本报错RuntimePlatform.WindowsWebPlayer 或者 RuntimePlatform.OSXWebPlayer 弃用的
热门文章
- python的前端怎么实现_Bootstrap、Python、Flask 做简单的前端
- oracle可以面向对象吗,Jbdc助手-数据库操作面向对象的实现(oracle)
- 数组元素替换_LeetCode 题解 | 189. 旋转数组
- 我在兰亭这三年之部门动荡
- B/S软件超越C/S软件的优势在哪里?
- 使用 Blender* 重新拓扑 VR 和游戏素材
- 最常见的《最聪明的技巧》实战讲解!
- C++ const 理解
- struts.xml web.xml配置正常,访问action时出现404
- Vert.x 发送邮件