kinect读取人体骨骼点数据

本文记录了通过Kinect设备成功读取人体骨骼点数据的过程。虽然初次运行时发现程序响应较慢,但经验证这并非代码问题。在保持一定距离(如一米以上)时,能够清晰并具有实时性地获取到骨骼点信息,相关实现参考了http://blog.csdn.net/zouxy09/article/details/8161617的博文。
摘要由CSDN通过智能技术生成

上一篇博文中实现了通过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 )  
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值