基于Kinect手势跟踪和识别
2014-04-16 10:23
633 查看
很多童鞋都在做kinect的手势识别,本人也基于kinect实现手势的跟踪和识别,跟踪过程比较稳定,几乎与OpenNI提供的SDK相当。手势的识别由于距离的原因尚不稳定,特别是当距离超过超过2.5米时。现在将手势跟踪主要代码提出来供大家参考!
XnPoint3D HandTrack(U16 *depIn, XnPoint3D handPrev)
{
XnPoint3D handCurr = handPrev;
XnPoint3D hArmPoint = {0};
XnPoint3D hFingerPoint = {0};
XnPoint3D handPred = {0};
static int handLostCnt = 0;
extern int trackFrmCnt;
if(handTrackCnt == 0)
{
handDiff.X = handDiff.Y = handDiff.Z = 0;
if(!handDiffMap)
handDiffMap = cvCreateImage(cvSize(640,480) ,IPL_DEPTH_8U, 1);
}
handTrackCnt ++;
handPred = HandPrediction(depIn,handPrev,kp);
if(handPred.Z!= 0)
{
handSharpArea = 0;
int radius = 240;
hArmPoint = GetHandSharp(depIn,handPred,radius,kp);
if(hArmPoint.Z!= 0)
{
hFingerPoint = GetFingerPoint(depIn,hArmPoint);
if(hFingerPoint.Z==0)
{
hFingerPoint = handPred;
bDirectionForward = true;
}
else
{
bLostHand = false;
int ZDiff = hFingerPoint.Z-hArmPoint.Z;
if(ZDiff>150 )
{
bDirectionForward = false;
}
}
}
else
{
hFingerPoint = handPred;
bDirectionForward = true;
}
handCurr = GetPalmPoint(depIn,hFingerPoint,90);
double dist = GetDist(handPrev,handCurr);
if((dist>TRACK_DIST && bHandPrevPred ) || (handSharpArea>TRACK_AREA))
{
bLostHand = true;
handCurr = handPrev;
}
}
else
{
handCurr = handPrev;
}
handDiff.X = handCurr.X - handPrev.X;
handDiff.Y = handCurr.Y - handPrev.Y;
handDiff.Z = handCurr.Z - handPrev.Z;
handPrev = handCurr;
memcpy(depPrev,depIn,sizeof(depPrev));
handCurr=TrackingSmoothing(handCurr,false);
return handCurr;
}
XnPoint3D HandTrack(U16 *depIn, XnPoint3D handPrev)
{
XnPoint3D handCurr = handPrev;
XnPoint3D hArmPoint = {0};
XnPoint3D hFingerPoint = {0};
XnPoint3D handPred = {0};
static int handLostCnt = 0;
extern int trackFrmCnt;
if(handTrackCnt == 0)
{
handDiff.X = handDiff.Y = handDiff.Z = 0;
if(!handDiffMap)
handDiffMap = cvCreateImage(cvSize(640,480) ,IPL_DEPTH_8U, 1);
}
handTrackCnt ++;
handPred = HandPrediction(depIn,handPrev,kp);
if(handPred.Z!= 0)
{
handSharpArea = 0;
int radius = 240;
hArmPoint = GetHandSharp(depIn,handPred,radius,kp);
if(hArmPoint.Z!= 0)
{
hFingerPoint = GetFingerPoint(depIn,hArmPoint);
if(hFingerPoint.Z==0)
{
hFingerPoint = handPred;
bDirectionForward = true;
}
else
{
bLostHand = false;
int ZDiff = hFingerPoint.Z-hArmPoint.Z;
if(ZDiff>150 )
{
bDirectionForward = false;
}
}
}
else
{
hFingerPoint = handPred;
bDirectionForward = true;
}
handCurr = GetPalmPoint(depIn,hFingerPoint,90);
double dist = GetDist(handPrev,handCurr);
if((dist>TRACK_DIST && bHandPrevPred ) || (handSharpArea>TRACK_AREA))
{
bLostHand = true;
handCurr = handPrev;
}
}
else
{
handCurr = handPrev;
}
handDiff.X = handCurr.X - handPrev.X;
handDiff.Y = handCurr.Y - handPrev.Y;
handDiff.Z = handCurr.Z - handPrev.Z;
handPrev = handCurr;
memcpy(depPrev,depIn,sizeof(depPrev));
handCurr=TrackingSmoothing(handCurr,false);
return handCurr;
}
相关文章推荐
- Kinect v2程序设计(C++) Body 篇 背景移除 骨骼跟踪 手势识别
- 基于一次手势训练的kinect 3D 动态手势识别(提纲)
- SoundWave:基于声波的手势识别 笔记本一秒变Kinect
- kinect骨架追踪及手势识别(基于ogre引擎)
- kinect+ogre骨架追踪及手势识别(基于微软kinectSDK)
- 基于Kinect的手势识别的相关资讯
- 【图像识别】【读论文】基于Kinect手势识别的网页控制软件设计——陈建军
- 基于C++的Kinect手势识别实现
- 初次接触kinect简单的实现了一些手势的捕捉和识别功能
- Kinect开发教程三:利用OpenNI进行手势识别
- 基于leapmotion的手势识别---4种手势
- [译]Kinect for Windows SDK开发入门(十):手势识别 上:基本概念
- 论文总结——《基于视觉的目标识别与跟踪综述》(1)
- Kinect 开发 —— 常见手势识别(上)
- Kinect for Windows SDK开发入门(十):手势识别 上:基本概念
- 基于opencv的手势识别
- Kinect for Windows SDK开发入门(十):手势识别 上:基本概念
- unity3d +KinectWrapperPackage手势识别
- [译]Kinect for Windows SDK开发入门(十):手势识别 上:基本概念
- Kinect for Windows SDK开发入门(十一):手势识别 下:基本手势识别