Mercurial > hg > Game > Kinect
comparison 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 |
comparison
equal
deleted
inserted
replaced
3:7e112b536f0a | 4:edf80c055589 |
---|---|
1 #include <stdio.h> | |
2 #include <XnVNite.h> | |
3 | |
4 #include "kinect.h" | |
5 | |
6 #define N_COLORS 6 | |
7 | |
8 XnVPointDrawer::XnVPointDrawer(XnUInt32 nHistory, xn::DepthGenerator depthGenerator) : | |
9 XnVPointControl("XnVPointDrawer"), | |
10 mNHistorySize(nHistory), mDepthGenerator(depthGenerator), mBDrawDM(false), mBFrameID(false) { | |
11 mPFPositionBuffer = new XnFloat[nHistory*3]; | |
12 } | |
13 | |
14 XnVPointDrawer::~XnVPointDrawer() { | |
15 std::map<XnUInt32, std::list<XnPoint3D> >::iterator iter; | |
16 for (iter = mHistory.begin(); iter != mHistory.end(); ++iter) | |
17 { | |
18 iter->second.clear(); | |
19 } | |
20 mHistory.clear(); | |
21 | |
22 delete []mPFPositionBuffer; | |
23 } | |
24 | |
25 void XnVPointDrawer::setDepthMap(XnBool bDrawDM) { | |
26 mBDrawDM = bDrawDM; | |
27 } | |
28 | |
29 void XnVPointDrawer::Update(XnVMessage* pMessage) { | |
30 // PointControl's Update calls all callbacks for each hand | |
31 XnVPointControl::Update(pMessage); | |
32 | |
33 if (mBDrawDM) | |
34 { | |
35 // Draw depth map | |
36 xn::DepthMetaData depthMD; | |
37 mDepthGenerator.GetMetaData(depthMD); | |
38 //drawDepthMap(depthMD); | |
39 } | |
40 if (mBFrameID) | |
41 { | |
42 // Print out frame ID | |
43 xn::DepthMetaData depthMD; | |
44 mDepthGenerator.GetMetaData(depthMD); | |
45 //DrawFrameID(depthMD.FrameID()); | |
46 } | |
47 | |
48 // Draw hands | |
49 Draw(); | |
50 } | |
51 | |
52 int XnVPointDrawer::getPosition(float &x, float &y, float &z) const { | |
53 std::map<XnUInt32, std::list<XnPoint3D> >::const_iterator itr; | |
54 itr = mHistory.begin(); | |
55 if (itr == mHistory.end()) return -1; | |
56 std::list<XnPoint3D>::const_iterator itr2; | |
57 itr2 = itr->second.begin(); | |
58 if (itr2 == itr->second.end()) return -1; | |
59 XnPoint3D pt(*itr2); | |
60 x = pt.X; | |
61 y = pt.Y; | |
62 z = pt.Z; | |
63 return 1; | |
64 } | |
65 void XnVPointDrawer::Draw() const { | |
66 std::map<XnUInt32, std::list<XnPoint3D> >::const_iterator itr; | |
67 itr = mHistory.begin(); | |
68 if (itr == mHistory.end()) return; | |
69 std::list<XnPoint3D>::const_iterator itr2; | |
70 itr2 = itr->second.begin(); | |
71 if (itr2 == itr->second.end()) return; | |
72 XnPoint3D pt(*itr2); | |
73 // printf("%f, %f, %f\n", pt.X, pt.Y, pt.Z); | |
74 | |
75 | |
76 // std::map<XnUInt32, std::list<XnPoint3D> >::const_iterator PointIterator; | |
77 | |
78 // // Go over each existing hand | |
79 // for (PointIterator = mHistory.begin(); | |
80 // PointIterator != mHistory.end(); | |
81 // ++PointIterator) | |
82 // { | |
83 // // Clear buffer | |
84 // XnUInt32 nPoints = 0; | |
85 // XnUInt32 i = 0; | |
86 // XnUInt32 Id = PointIterator->first; | |
87 | |
88 // // Go over all previous positions of current hand | |
89 // std::list<XnPoint3D>::const_iterator PositionIterator; | |
90 // for (PositionIterator = PointIterator->second.begin(); | |
91 // PositionIterator != PointIterator->second.end(); | |
92 // ++PositionIterator, ++i) | |
93 // { | |
94 // // Add position to buffer | |
95 // XnPoint3D pt(*PositionIterator); | |
96 // printf("%f, %f, %f\n", pt.X, pt.Y, pt.Z); | |
97 // mPFPositionBuffer[3*i] = pt.X; | |
98 // mPFPositionBuffer[3*i + 1] = pt.Y; | |
99 // mPFPositionBuffer[3*i + 2] = 0;//pt.Z(); | |
100 // break; | |
101 // } | |
102 | |
103 // // Set color | |
104 // XnUInt32 nColor = Id % N_COLORS; | |
105 // //XnUInt32 nSingle = GetPrimaryID(); | |
106 // if (Id == GetPrimaryID()) | |
107 // nColor = 6; | |
108 // } | |
109 } | |
110 | |
111 static XnBool bShouldPrint = false; | |
112 void XnVPointDrawer::OnPointCreate(const XnVHandPointContext* cxt) | |
113 { | |
114 printf("** %d\n", cxt->nID); | |
115 // Create entry for the hand | |
116 mHistory[cxt->nID].clear(); | |
117 bShouldPrint = true; | |
118 OnPointUpdate(cxt); | |
119 bShouldPrint = true; | |
120 } | |
121 // Handle new position of an existing hand | |
122 void XnVPointDrawer::OnPointUpdate(const XnVHandPointContext* cxt) | |
123 { | |
124 // positions are kept in projective coordinates, since they are only used for drawing | |
125 XnPoint3D ptProjective(cxt->ptPosition); | |
126 | |
127 if (bShouldPrint)printf("Point (%f,%f,%f)", ptProjective.X, ptProjective.Y, ptProjective.Z); | |
128 mDepthGenerator.ConvertRealWorldToProjective(1, &ptProjective, &ptProjective); | |
129 if (bShouldPrint)printf(" -> (%f,%f,%f)\n", ptProjective.X, ptProjective.Y, ptProjective.Z); | |
130 | |
131 // Add new position to the history buffer | |
132 mHistory[cxt->nID].push_front(ptProjective); | |
133 // Keep size of history buffer | |
134 if (mHistory[cxt->nID].size() > mNHistorySize) | |
135 mHistory[cxt->nID].pop_back(); | |
136 bShouldPrint = false; | |
137 } | |
138 | |
139 // Handle destruction of an existing hand | |
140 void XnVPointDrawer::OnPointDestroy(XnUInt32 nID) | |
141 { | |
142 // No need for the history buffer | |
143 mHistory.erase(nID); | |
144 } |