### kinect + winSDK代码
```
#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 i
机器人视觉项目:视觉检测识别+机器人跟随(15)
最新推荐文章于 2020-10-11 23:18:02 发布
本文介绍了一个机器人视觉项目,利用Windows SDK和Kinect设备进行人体骨骼追踪,实现机器人对人的精准跟随。通过深度学习技术解析摄像头数据,详细探讨了骨骼关键点识别与机器人运动控制策略。
摘要由CSDN通过智能技术生成