Mercurial > hg > Game > Kinect
diff example/KinectTrack.cc @ 4:edf80c055589 default tip
kinect run on Cerium
author | kazz <kazz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 01 Feb 2011 14:44:56 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/KinectTrack.cc Tue Feb 01 14:44:56 2011 +0900 @@ -0,0 +1,144 @@ +#include <stdio.h> +#include <XnVNite.h> + +#include "kinect.h" + +#define N_COLORS 6 + +XnVPointDrawer::XnVPointDrawer(XnUInt32 nHistory, xn::DepthGenerator depthGenerator) : + XnVPointControl("XnVPointDrawer"), + mNHistorySize(nHistory), mDepthGenerator(depthGenerator), mBDrawDM(false), mBFrameID(false) { + mPFPositionBuffer = new XnFloat[nHistory*3]; +} + +XnVPointDrawer::~XnVPointDrawer() { + std::map<XnUInt32, std::list<XnPoint3D> >::iterator iter; + for (iter = mHistory.begin(); iter != mHistory.end(); ++iter) + { + iter->second.clear(); + } + mHistory.clear(); + + delete []mPFPositionBuffer; +} + +void XnVPointDrawer::setDepthMap(XnBool bDrawDM) { + mBDrawDM = bDrawDM; +} + +void XnVPointDrawer::Update(XnVMessage* pMessage) { + // PointControl's Update calls all callbacks for each hand + XnVPointControl::Update(pMessage); + + if (mBDrawDM) + { + // Draw depth map + xn::DepthMetaData depthMD; + mDepthGenerator.GetMetaData(depthMD); + //drawDepthMap(depthMD); + } + if (mBFrameID) + { + // Print out frame ID + xn::DepthMetaData depthMD; + mDepthGenerator.GetMetaData(depthMD); + //DrawFrameID(depthMD.FrameID()); + } + + // Draw hands + Draw(); +} + +int XnVPointDrawer::getPosition(float &x, float &y, float &z) const { + std::map<XnUInt32, std::list<XnPoint3D> >::const_iterator itr; + itr = mHistory.begin(); + if (itr == mHistory.end()) return -1; + std::list<XnPoint3D>::const_iterator itr2; + itr2 = itr->second.begin(); + if (itr2 == itr->second.end()) return -1; + XnPoint3D pt(*itr2); + x = pt.X; + y = pt.Y; + z = pt.Z; + return 1; +} +void XnVPointDrawer::Draw() const { + std::map<XnUInt32, std::list<XnPoint3D> >::const_iterator itr; + itr = mHistory.begin(); + if (itr == mHistory.end()) return; + std::list<XnPoint3D>::const_iterator itr2; + itr2 = itr->second.begin(); + if (itr2 == itr->second.end()) return; + XnPoint3D pt(*itr2); +// printf("%f, %f, %f\n", pt.X, pt.Y, pt.Z); + + + // std::map<XnUInt32, std::list<XnPoint3D> >::const_iterator PointIterator; + + // // Go over each existing hand + // for (PointIterator = mHistory.begin(); + // PointIterator != mHistory.end(); + // ++PointIterator) + // { + // // Clear buffer + // XnUInt32 nPoints = 0; + // XnUInt32 i = 0; + // XnUInt32 Id = PointIterator->first; + + // // Go over all previous positions of current hand + // std::list<XnPoint3D>::const_iterator PositionIterator; + // for (PositionIterator = PointIterator->second.begin(); + // PositionIterator != PointIterator->second.end(); + // ++PositionIterator, ++i) + // { + // // Add position to buffer + // XnPoint3D pt(*PositionIterator); + // printf("%f, %f, %f\n", pt.X, pt.Y, pt.Z); + // mPFPositionBuffer[3*i] = pt.X; + // mPFPositionBuffer[3*i + 1] = pt.Y; + // mPFPositionBuffer[3*i + 2] = 0;//pt.Z(); + // break; + // } + + // // Set color + // XnUInt32 nColor = Id % N_COLORS; + // //XnUInt32 nSingle = GetPrimaryID(); + // if (Id == GetPrimaryID()) + // nColor = 6; + // } +} + +static XnBool bShouldPrint = false; +void XnVPointDrawer::OnPointCreate(const XnVHandPointContext* cxt) +{ + printf("** %d\n", cxt->nID); + // Create entry for the hand + mHistory[cxt->nID].clear(); + bShouldPrint = true; + OnPointUpdate(cxt); + bShouldPrint = true; +} +// Handle new position of an existing hand +void XnVPointDrawer::OnPointUpdate(const XnVHandPointContext* cxt) +{ + // positions are kept in projective coordinates, since they are only used for drawing + XnPoint3D ptProjective(cxt->ptPosition); + + if (bShouldPrint)printf("Point (%f,%f,%f)", ptProjective.X, ptProjective.Y, ptProjective.Z); + mDepthGenerator.ConvertRealWorldToProjective(1, &ptProjective, &ptProjective); + if (bShouldPrint)printf(" -> (%f,%f,%f)\n", ptProjective.X, ptProjective.Y, ptProjective.Z); + + // Add new position to the history buffer + mHistory[cxt->nID].push_front(ptProjective); + // Keep size of history buffer + if (mHistory[cxt->nID].size() > mNHistorySize) + mHistory[cxt->nID].pop_back(); + bShouldPrint = false; +} + +// Handle destruction of an existing hand +void XnVPointDrawer::OnPointDestroy(XnUInt32 nID) +{ + // No need for the history buffer + mHistory.erase(nID); +}