1: #include <cvaux.h>
2: #include <highgui.h>
3: #include <XnCppWrapper.h>
4: #include <string>
5: #include <conio.h>
6:
7: using namespace cv;
8: using namespace xn;
9: using namespace std;
10:
11: #define SAMPLE_XML_PATH "XML_Tracking.xml"
12: #define CHECK_RC(rc, what) \
13: if (rc != XN_STATUS_OK) \
14: { \
15: printf("%s failed: %s\n", what, xnGetStatusString(rc)); \
16: return rc; \
17: }
18:
19: int main(int argc, char** argv)
20: {
21: Context context;
22: EnumerationErrors errors;
23: XnStatus nRetVal;
24:
25: nRetVal = context.InitFromXmlFile(SAMPLE_XML_PATH);
26: CHECK_RC(nRetVal,"Initialize Context");
27:
28: //DEPTH
29: DepthGenerator depth; //depth context
30: DepthMetaData depthMD; //depth metadata
31: nRetVal = context.FindExistingNode(XN_NODE_TYPE_DEPTH, depth);
32: CHECK_RC(nRetVal,"Initialize Depth Node");
33:
34: //RGB IMAGE
35: ImageGenerator image; //image context
36: ImageMetaData imageMD; //image metadata
37: nRetVal = context.FindExistingNode(XN_NODE_TYPE_IMAGE, image);
38: CHECK_RC(nRetVal,"Initialize Image Node");
39:
40: //USER
41: UserGenerator user;
42: XnCallbackHandle hUserCallbacks;
43: nRetVal = context.FindExistingNode(XN_NODE_TYPE_USER, user);
44: CHECK_RC(nRetVal,"Initialize User Node");
45:
46: //Scene
47: SceneMetaData scene;
48: SceneMetaData sceneUser;
49:
50: //OPENCV VARIABLE
51: Mat depthshow;
52: Mat show;
53: IplImage* tracked = cvCreateImage(cvSize(500,500), 8, 3);
54: imshow("tracked",tracked);
55: int numframe = 0;
56: CvFont font;
57: cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX_SMALL, 1.0, 1.0, 0, 1);
58:
59: //DRAW GRID PATTERN IN THE OUTPUT TRAJECTORY WINDOW
60: cvLine(tracked,cvPoint( 50,0),cvPoint( 50,500),CV_RGB(150,150,150),2);
61: cvLine(tracked,cvPoint(150,0),cvPoint(150,500),CV_RGB(150,150,150),2);
62: cvLine(tracked,cvPoint(250,0),cvPoint(250,500),CV_RGB(150,150,150),2);
63: cvLine(tracked,cvPoint(350,0),cvPoint(350,500),CV_RGB(150,150,150),2);
64: cvLine(tracked,cvPoint(450,0),cvPoint(450,500),CV_RGB(150,150,150),2);
65: cvLine(tracked,cvPoint(0,100),cvPoint(500,100),CV_RGB(150,150,150),2);
66: cvLine(tracked,cvPoint(0,200),cvPoint(500,200),CV_RGB(150,150,150),2);
67: cvLine(tracked,cvPoint(0,300),cvPoint(500,300),CV_RGB(150,150,150),2);
68: cvLine(tracked,cvPoint(0,400),cvPoint(500,400),CV_RGB(150,150,150),2);
69:
70: //PATH
71: cvLine(tracked,cvPoint(350,300),cvPoint(150,300),CV_RGB(255,255,0),2);
72: cvLine(tracked,cvPoint(150,300),cvPoint(150,200),CV_RGB(255,255,0),2);
73: cvLine(tracked,cvPoint(150,200),cvPoint(350,200),CV_RGB(255,255,0),2);
74: cvLine(tracked,cvPoint(350,200),cvPoint(350,100),CV_RGB(255,255,0),2);
75: cvLine(tracked,cvPoint(350,100),cvPoint(150,100),CV_RGB(255,255,0),2);
76: cvLine(tracked,cvPoint(150,100),cvPoint(150,0),CV_RGB(255,255,0),2);
77: cvLine(tracked,cvPoint(150,0),cvPoint(350,0),CV_RGB(255,255,0),2);
78:
79: while (kbhit() == 0)
80: {
81: context.WaitAnyUpdateAll();
82: image.GetMetaData(imageMD);
83: depth.GetMetaData(depthMD);
84: numframe++;
85:
86: ///Converting to OpenCV Matrix
87: Mat depth16(480,640,CV_16SC1,(unsigned short*)depthMD.WritableData());
88: depth16.convertTo(depthshow,CV_8U,-255/4096.0,255); //convert depth 16 bit image to 8 bit image
89: Mat imni(480,640,CV_8UC3,(uchar*)imageMD.WritableData());
90: cvtColor(imni,show,CV_RGB2BGR); //convert color space : RGB2BGR
91:
92: int number_of_user = user.GetNumberOfUsers();
93: if (number_of_user > 0) {
94: nRetVal = user.GetUserPixels(0,scene);
95: CHECK_RC(nRetVal, "Get Scene Meta Data");
96: Mat sceneMap(480,640,CV_16SC1,(unsigned short*)scene.WritableData());
97: sceneMap.convertTo(sceneMap,8,60,0);
98:
99: for (int i=1;i<=number_of_user;i++) {
100: XnPoint3D CoM;
101: xnGetUserCoM(user,i,&CoM);
102:
103: if (CoM.X != 0 && CoM.Y != 0 && CoM.Z != 0) {
104: int R=255,G=255,B=255;
105:
106: //APPROXIMATION OF HUMAN CENTRAL POINT
107: int x = (int) CoM.X/10;
108: int z = (int) CoM.Z/10;
109: int xx,zz;
110: if (x == 0) {
111: xx = 0;
112: zz = z + 20;
113: }
114: else {
115: xx = (int) x + (20 * x / sqrt((double) x*x + z*z));
116: zz = (int) z + (20 * z / sqrt((double) x*x + z*z));
117: }
118: cvCircle(tracked,cvPoint(250 + xx, 500 - zz),2,CV_RGB(R,G,B),-1);
119: printf("%d\t%d\n", xx, zz);
120:
121:
122: ///CENTER OF MASS
123: XnPoint3D imagePoint;
124: depth.ConvertRealWorldToProjective(1,&CoM,&imagePoint);
125: cvCircle(&show.operator IplImage(),cvPoint((int)imagePoint.X,(int)imagePoint.Y),5,CV_RGB(R,G,B),-1);
126: }
127: }
128: imshow("scene",sceneMap);
129: imshow("tracked", tracked);
130: }
131: imshow("image",show);
132: imshow("depth",depthshow);
133:
134: waitKey(33);
135: }
136: cvReleaseImage(&tracked);
137: context.Shutdown();
138: return 0;
139: }