上一篇博文中实现了通过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 )