Advertisement

Kinect&OpenNI开发(一) 编程环境搭建与测试

阅读量:

本来用VS用的好好的,但是转到了Ubuntu后发现直接抓瞎= =

以新手的心态真实地使用了Eclipse,在使用Helios编译C++时会遇到各种问题。发现网上资源匮乏,现有的参考资料存在诸多错误。因此撰写本文,旨在帮助后来者节省不必要的努力在搭建软件环境上。

基于Ubuntu 14.04 LTS(Long Term Support)开发环境搭建而成。另外,请注意以下几点:其中涉及对OpenCV、OpenGL、OpenNI以及Nite等技术框架的配置与集成,请参考相关文档获取详细指导。

本文主要参考了Ubuntu下安装配置OpenNI,OpenCV一文,并在此基础上进行了调整和完善

一、安装Eclipse

1.下载

http://www.eclipse.org/downloads/

因为我是用C++,所以下载的IDE 4 C/C++ Developers

2.解压出 eclipse文件夹并移动到想要的文件夹下

3.创建桌面链接

在gedit中配置Eclipse IDE的位置。
输入以下内容:
[Desktop Entry]
设置主程序名为Eclipse。
编码设为UTF-8。
启动程序路径设为(文件夹所在位置)eclipse/eclipse。
图标路径设为(文件夹所在位置)eclipse/icon.xpm。
不以终端方式运行。
程序类型设为应用。
分类包括:应用;开发;

二、OpenCV(我的版本是3.1.0)

1.使用eclipse建立新工程,如testOpenCV

Properties

双击左侧的Project Explorer中的TestOpenCV项目。单击右侧的【Properties

请在【

测试代码:

复制代码
 #include <cv.h>

    
 #include <opencv2/opencv.hpp>//原文中都是早期版本OpenCV用的函数名和库文件,并不能通过编译
    
  
    
 using namespace cv;
    
  
    
 int main( )
    
 {
    
   Mat image;
    
   image = imread( "lena.jpg", 1);
    
  
    
  namedWindow( "Display Image", CV_WINDOW_AUTOSIZE );
    
   imshow( "Display Image", image );
    
  
    
   waitKey(0);
    
  
    
   return 0;
    
 }

__

(Lena.jpg自己随便找一张图片就行,放到cpp所在的文件夹下)

三、OpenNI

1.新建一个空的或helloworld工程,如kinectOpenNI;

在左侧的 Project Explorer 中右键点击 KinectOpenNI ,然后点击 Properties 。接着,在弹出的对话框左侧选择 C/C++ Build > Settings > GCC C++ Compiler(如果使用C语言则选择GCC C Compiler)> Includes

在右侧 Include paths(-l) 里点右边绿色加号,添加两个路径:

/usr/include/ni

/usr/include/nite

3.然后再选择 GCC C++ Linker- >Libraries,在 Libraries (-l) 中添加
OpenNI

glut

GL(原文中没有提到的库,但是必须要用到)

请留意:XnVNite可能存在版本号,请到你的/usr/lib目录中查看一个名为libXnVNite_XXXX.so的文件(如libXnVNite_1_5_2.so),因此建议你配置为libXnVNite_1_5_2.so;为了保持灵活性,在配置时建议采用灵活应对的方式;如果设置错误可能会导致系统提示错误信息

由于这几个库都是位于系统/usr/lib/目录中的位置关系而无需附加Library搜索路径(-L)选项。

测试代码:

复制代码
 /******************************* * * *OpenNI 1.x Alpha * *Copyright (C) 2011 PrimeSense Ltd. * * * *This file is part of OpenNI. * * * *OpenNI is free software: you can redistribute it and/or modify * *it under the terms of the GNU Lesser General Public License as published * *by the Free Software Foundation, either version 3 of the License, or * *(at your option) any later version.* * * *OpenNI is distributed in the hope that it will be useful,* *but WITHOUT ANY WARRANTY; without even the implied warranty of * *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * *GNU Lesser General Public License for more details.* * * *You should have received a copy of the GNU Lesser General Public License * *along with OpenNI. If not, see <http://www.gnu.org/licenses/>. * * * ***********************************/
    
 //---------------------------------------------------------------------------
    
 // Includes
    
 //---------------------------------------------------------------------------
    
 #include <XnOS.h>
    
 #include <GL/glut.h>
    
 #include <math.h>
    
  
    
 #include <XnCppWrapper.h>
    
 using namespace xn;
    
  
    
 //---------------------------------------------------------------------------
    
 // Defines
    
 //---------------------------------------------------------------------------
    
 #define SAMPLE_XML_PATH "/home/dna/kinect/OpenNI-Bin-Dev-Linux-x64-v1.5.7.10/Samples/Config/SamplesConfig.xml"
    
  
    
 #define GL_WIN_SIZE_X 1280
    
 #define GL_WIN_SIZE_Y 1024
    
  
    
 #define DISPLAY_MODE_OVERLAY 1
    
 #define DISPLAY_MODE_DEPTH 2
    
 #define DISPLAY_MODE_IMAGE 3
    
 #define DEFAULT_DISPLAY_MODE DISPLAY_MODE_DEPTH
    
  
    
 #define MAX_DEPTH 10000
    
  
    
 //---------------------------------------------------------------------------
    
 // Globals
    
 //---------------------------------------------------------------------------
    
 float g_pDepthHist[MAX_DEPTH];
    
 XnRGB24Pixel* g_pTexMap = NULL;
    
 unsigned int g_nTexMapX = 0;
    
 unsigned int g_nTexMapY = 0;
    
  
    
 unsigned int g_nViewState = DEFAULT_DISPLAY_MODE;
    
  
    
 Context g_context;
    
 ScriptNode g_scriptNode;
    
 DepthGenerator g_depth;
    
 ImageGenerator g_image;
    
 DepthMetaData g_depthMD;
    
 ImageMetaData g_imageMD;
    
  
    
 //---------------------------------------------------------------------------
    
 // Code
    
 //---------------------------------------------------------------------------
    
  
    
 void glutIdle (void)
    
 {
    
 // Display the frame
    
 glutPostRedisplay();
    
 }
    
  
    
 void glutDisplay (void)
    
 {
    
 XnStatus rc = XN_STATUS_OK;
    
  
    
 // Read a new frame
    
 rc = g_context.WaitAnyUpdateAll();
    
 if (rc != XN_STATUS_OK)
    
 {
    
 printf("Read failed: %s\n", xnGetStatusString(rc));
    
 return;
    
 }
    
  
    
 g_depth.GetMetaData(g_depthMD);
    
 g_image.GetMetaData(g_imageMD);
    
  
    
 const XnDepthPixel* pDepth = g_depthMD.Data();
    
 const XnUInt8* pImage = g_imageMD.Data();
    
  
    
 unsigned int nImageScale = GL_WIN_SIZE_X / g_depthMD.FullXRes();
    
  
    
 // Copied from SimpleViewer
    
 // Clear the OpenGL buffers
    
 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
  
    
 // Setup the OpenGL viewpoint
    
 glMatrixMode(GL_PROJECTION);
    
 glPushMatrix();
    
 glLoadIdentity();
    
 glOrtho(0, GL_WIN_SIZE_X, GL_WIN_SIZE_Y, 0, -1.0, 1.0);
    
  
    
 // Calculate the accumulative histogram (the yellow display...)
    
 xnOSMemSet(g_pDepthHist, 0, MAX_DEPTH*sizeof(float));
    
  
    
 unsigned int nNumberOfPoints = 0;
    
 for (XnUInt y = 0; y < g_depthMD.YRes(); ++y)
    
 {
    
 for (XnUInt x = 0; x < g_depthMD.XRes(); ++x, ++pDepth)
    
 {
    
 if (*pDepth != 0)
    
 {
    
 g_pDepthHist[*pDepth]++;
    
 nNumberOfPoints++;
    
 }
    
 }
    
 }
    
 for (int nIndex=1; nIndex<MAX_DEPTH; nIndex++)
    
 {
    
 g_pDepthHist[nIndex] += g_pDepthHist[nIndex-1];
    
 }
    
 if (nNumberOfPoints)
    
 {
    
 for (int nIndex=1; nIndex<MAX_DEPTH; nIndex++)
    
 {
    
 g_pDepthHist[nIndex] = (unsigned int)(256 * (1.0f - (g_pDepthHist[nIndex] / nNumberOfPoints)));
    
 }
    
 }
    
  
    
 xnOSMemSet(g_pTexMap, 0, g_nTexMapX*g_nTexMapY*sizeof(XnRGB24Pixel));
    
  
    
 // check if we need to draw image frame to texture
    
 if (g_nViewState == DISPLAY_MODE_OVERLAY ||
    
 g_nViewState == DISPLAY_MODE_IMAGE)
    
 {
    
 const XnRGB24Pixel* pImageRow = g_imageMD.RGB24Data();
    
 XnRGB24Pixel* pTexRow = g_pTexMap + g_imageMD.YOffset() * g_nTexMapX;
    
  
    
 for (XnUInt y = 0; y < g_imageMD.YRes(); ++y)
    
 {
    
 const XnRGB24Pixel* pImage = pImageRow;
    
 XnRGB24Pixel* pTex = pTexRow + g_imageMD.XOffset();
    
  
    
 for (XnUInt x = 0; x < g_imageMD.XRes(); ++x, ++pImage, ++pTex)
    
 {
    
 *pTex = *pImage;
    
 }
    
  
    
 pImageRow += g_imageMD.XRes();
    
 pTexRow += g_nTexMapX;
    
 }
    
 }
    
  
    
 // check if we need to draw depth frame to texture
    
 if (g_nViewState == DISPLAY_MODE_OVERLAY ||
    
 g_nViewState == DISPLAY_MODE_DEPTH)
    
 {
    
 const XnDepthPixel* pDepthRow = g_depthMD.Data();
    
 XnRGB24Pixel* pTexRow = g_pTexMap + g_depthMD.YOffset() * g_nTexMapX;
    
  
    
 for (XnUInt y = 0; y < g_depthMD.YRes(); ++y)
    
 {
    
 const XnDepthPixel* pDepth = pDepthRow;
    
 XnRGB24Pixel* pTex = pTexRow + g_depthMD.XOffset();
    
  
    
 for (XnUInt x = 0; x < g_depthMD.XRes(); ++x, ++pDepth, ++pTex)
    
 {
    
 if (*pDepth != 0)
    
 {
    
 int nHistValue = g_pDepthHist[*pDepth];
    
 pTex->nRed = nHistValue;
    
 pTex->nGreen = nHistValue;
    
 pTex->nBlue = 0;
    
 }
    
 }
    
  
    
 pDepthRow += g_depthMD.XRes();
    
 pTexRow += g_nTexMapX;
    
 }
    
 }
    
  
    
 // Create the OpenGL texture map
    
 glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
    
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    
 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, g_nTexMapX, g_nTexMapY, 0, GL_RGB, GL_UNSIGNED_BYTE, g_pTexMap);
    
  
    
 // Display the OpenGL texture map
    
 glColor4f(1,1,1,1);
    
  
    
 glBegin(GL_QUADS);
    
  
    
 int nXRes = g_depthMD.FullXRes();
    
 int nYRes = g_depthMD.FullYRes();
    
  
    
 // upper left
    
 glTexCoord2f(0, 0);
    
 glVertex2f(0, 0);
    
 // upper right
    
 glTexCoord2f((float)nXRes/(float)g_nTexMapX, 0);
    
 glVertex2f(GL_WIN_SIZE_X, 0);
    
 // bottom right
    
 glTexCoord2f((float)nXRes/(float)g_nTexMapX, (float)nYRes/(float)g_nTexMapY);
    
 glVertex2f(GL_WIN_SIZE_X, GL_WIN_SIZE_Y);
    
 // bottom left
    
 glTexCoord2f(0, (float)nYRes/(float)g_nTexMapY);
    
 glVertex2f(0, GL_WIN_SIZE_Y);
    
  
    
 glEnd();
    
  
    
 // Swap the OpenGL display buffers
    
 glutSwapBuffers();
    
 }
    
  
    
 void glutKeyboard (unsigned char key, int x, int y)
    
 {
    
 switch (key)
    
 {
    
 case 27:
    
 exit (1);
    
 case '1':
    
 g_nViewState = DISPLAY_MODE_OVERLAY;
    
 g_depth.GetAlternativeViewPointCap().SetViewPoint(g_image);
    
 break;
    
 case '2':
    
 g_nViewState = DISPLAY_MODE_DEPTH;
    
 g_depth.GetAlternativeViewPointCap().ResetViewPoint();
    
 break;
    
 case '3':
    
 g_nViewState = DISPLAY_MODE_IMAGE;
    
 g_depth.GetAlternativeViewPointCap().ResetViewPoint();
    
 break;
    
 case 'm':
    
 g_context.SetGlobalMirror(!g_context.GetGlobalMirror());
    
 break;
    
 }
    
 }
    
  
    
 int main(int argc, char* argv[])
    
 {
    
 XnStatus rc;
    
  
    
 EnumerationErrors errors;
    
 rc = g_context.InitFromXmlFile(SAMPLE_XML_PATH, g_scriptNode, &errors);
    
 if (rc == XN_STATUS_NO_NODE_PRESENT)
    
 {
    
 XnChar strError[1024];
    
 errors.ToString(strError, 1024);
    
 printf("%s\n", strError);
    
 return (rc);
    
 }
    
 else if (rc != XN_STATUS_OK)
    
 {
    
 printf("Open failed: %s\n", xnGetStatusString(rc));
    
 return (rc);
    
 }
    
  
    
 rc = g_context.FindExistingNode(XN_NODE_TYPE_DEPTH, g_depth);
    
 if (rc != XN_STATUS_OK)
    
 {
    
 printf("No depth node exists! Check your XML.");
    
 return 1;
    
 }
    
  
    
 rc = g_context.FindExistingNode(XN_NODE_TYPE_IMAGE, g_image);
    
 if (rc != XN_STATUS_OK)
    
 {
    
 printf("No image node exists! Check your XML.");
    
 return 1;
    
 }
    
  
    
 g_depth.GetMetaData(g_depthMD);
    
 g_image.GetMetaData(g_imageMD);
    
  
    
 // Hybrid mode isn't supported in this sample
    
 if (g_imageMD.FullXRes() != g_depthMD.FullXRes() || g_imageMD.FullYRes() != g_depthMD.FullYRes())
    
 {
    
 printf ("The device depth and image resolution must be equal!\n");
    
 return 1;
    
 }
    
  
    
 // RGB is the only image format supported.
    
 if (g_imageMD.PixelFormat() != XN_PIXEL_FORMAT_RGB24)
    
 {
    
 printf("The device image format must be RGB24\n");
    
 return 1;
    
 }
    
  
    
 // Texture map init
    
 g_nTexMapX = (((unsigned short)(g_depthMD.FullXRes()-1) / 512) + 1) * 512;
    
 g_nTexMapY = (((unsigned short)(g_depthMD.FullYRes()-1) / 512) + 1) * 512;
    
 g_pTexMap = (XnRGB24Pixel*)malloc(g_nTexMapX * g_nTexMapY * sizeof(XnRGB24Pixel));
    
  
    
 // OpenGL init
    
 glutInit(&argc, argv);
    
 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    
 glutInitWindowSize(GL_WIN_SIZE_X, GL_WIN_SIZE_Y);
    
 glutCreateWindow ("OpenNI Simple Viewer");
    
 glutFullScreen();
    
 glutSetCursor(GLUT_CURSOR_NONE);
    
  
    
 glutKeyboardFunc(glutKeyboard);
    
 glutDisplayFunc(glutDisplay);
    
 glutIdleFunc(glutIdle);
    
  
    
 glDisable(GL_DEPTH_TEST);
    
 glEnable(GL_TEXTURE_2D);
    
  
    
 // Per frame code is in glutDisplay
    
 glutMainLoop();
    
  
    
 return 0;
    
 }

如果环境搭建好了的话,应该会显示深度图像。

复制代码
 /******************************* * * *OpenNI 1.x Alpha * *Copyright (C) 2011 PrimeSense Ltd. * * * *This file is part of OpenNI. * * * *OpenNI is free software: you can redistribute it and/or modify * *it under the terms of the GNU Lesser General Public License as published * *by the Free Software Foundation, either version 3 of the License, or * *(at your option) any later version.* * * *OpenNI is distributed in the hope that it will be useful,* *but WITHOUT ANY WARRANTY; without even the implied warranty of * *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * *GNU Lesser General Public License for more details.* * * *You should have received a copy of the GNU Lesser General Public License * *along with OpenNI. If not, see <http://www.gnu.org/licenses/>. * * * ***********************************/
    
 //---------------------------------------------------------------------------
    
 // Includes
    
 //---------------------------------------------------------------------------
    
 #include <XnOS.h>
    
 #include <GL/glut.h>
    
 #include <math.h>
    
  
    
 #include <XnCppWrapper.h>
    
 using namespace xn;
    
  
    
 //---------------------------------------------------------------------------
    
 // Defines
    
 //---------------------------------------------------------------------------
    
 #define SAMPLE_XML_PATH "/home/dna/kinect/OpenNI-Bin-Dev-Linux-x64-v1.5.7.10/Samples/Config/SamplesConfig.xml"
    
  
    
 #define GL_WIN_SIZE_X 1280
    
 #define GL_WIN_SIZE_Y 1024
    
  
    
 #define DISPLAY_MODE_OVERLAY 1
    
 #define DISPLAY_MODE_DEPTH 2
    
 #define DISPLAY_MODE_IMAGE 3
    
 #define DEFAULT_DISPLAY_MODE DISPLAY_MODE_DEPTH
    
  
    
 #define MAX_DEPTH 10000
    
  
    
 //---------------------------------------------------------------------------
    
 // Globals
    
 //---------------------------------------------------------------------------
    
 float g_pDepthHist[MAX_DEPTH];
    
 XnRGB24Pixel* g_pTexMap = NULL;
    
 unsigned int g_nTexMapX = 0;
    
 unsigned int g_nTexMapY = 0;
    
  
    
 unsigned int g_nViewState = DEFAULT_DISPLAY_MODE;
    
  
    
 Context g_context;
    
 ScriptNode g_scriptNode;
    
 DepthGenerator g_depth;
    
 ImageGenerator g_image;
    
 DepthMetaData g_depthMD;
    
 ImageMetaData g_imageMD;
    
  
    
 //---------------------------------------------------------------------------
    
 // Code
    
 //---------------------------------------------------------------------------
    
  
    
 void glutIdle (void)
    
 {
    
 // Display the frame
    
 glutPostRedisplay();
    
 }
    
  
    
 void glutDisplay (void)
    
 {
    
 XnStatus rc = XN_STATUS_OK;
    
  
    
 // Read a new frame
    
 rc = g_context.WaitAnyUpdateAll();
    
 if (rc != XN_STATUS_OK)
    
 {
    
 printf("Read failed: %s\n", xnGetStatusString(rc));
    
 return;
    
 }
    
  
    
 g_depth.GetMetaData(g_depthMD);
    
 g_image.GetMetaData(g_imageMD);
    
  
    
 const XnDepthPixel* pDepth = g_depthMD.Data();
    
 const XnUInt8* pImage = g_imageMD.Data();
    
  
    
 unsigned int nImageScale = GL_WIN_SIZE_X / g_depthMD.FullXRes();
    
  
    
 // Copied from SimpleViewer
    
 // Clear the OpenGL buffers
    
 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
  
    
 // Setup the OpenGL viewpoint
    
 glMatrixMode(GL_PROJECTION);
    
 glPushMatrix();
    
 glLoadIdentity();
    
 glOrtho(0, GL_WIN_SIZE_X, GL_WIN_SIZE_Y, 0, -1.0, 1.0);
    
  
    
 // Calculate the accumulative histogram (the yellow display...)
    
 xnOSMemSet(g_pDepthHist, 0, MAX_DEPTH*sizeof(float));
    
  
    
 unsigned int nNumberOfPoints = 0;
    
 for (XnUInt y = 0; y < g_depthMD.YRes(); ++y)
    
 {
    
 for (XnUInt x = 0; x < g_depthMD.XRes(); ++x, ++pDepth)
    
 {
    
 if (*pDepth != 0)
    
 {
    
 g_pDepthHist[*pDepth]++;
    
 nNumberOfPoints++;
    
 }
    
 }
    
 }
    
 for (int nIndex=1; nIndex<MAX_DEPTH; nIndex++)
    
 {
    
 g_pDepthHist[nIndex] += g_pDepthHist[nIndex-1];
    
 }
    
 if (nNumberOfPoints)
    
 {
    
 for (int nIndex=1; nIndex<MAX_DEPTH; nIndex++)
    
 {
    
 g_pDepthHist[nIndex] = (unsigned int)(256 * (1.0f - (g_pDepthHist[nIndex] / nNumberOfPoints)));
    
 }
    
 }
    
  
    
 xnOSMemSet(g_pTexMap, 0, g_nTexMapX*g_nTexMapY*sizeof(XnRGB24Pixel));
    
  
    
 // check if we need to draw image frame to texture
    
 if (g_nViewState == DISPLAY_MODE_OVERLAY ||
    
 g_nViewState == DISPLAY_MODE_IMAGE)
    
 {
    
 const XnRGB24Pixel* pImageRow = g_imageMD.RGB24Data();
    
 XnRGB24Pixel* pTexRow = g_pTexMap + g_imageMD.YOffset() * g_nTexMapX;
    
  
    
 for (XnUInt y = 0; y < g_imageMD.YRes(); ++y)
    
 {
    
 const XnRGB24Pixel* pImage = pImageRow;
    
 XnRGB24Pixel* pTex = pTexRow + g_imageMD.XOffset();
    
  
    
 for (XnUInt x = 0; x < g_imageMD.XRes(); ++x, ++pImage, ++pTex)
    
 {
    
 *pTex = *pImage;
    
 }
    
  
    
 pImageRow += g_imageMD.XRes();
    
 pTexRow += g_nTexMapX;
    
 }
    
 }
    
  
    
 // check if we need to draw depth frame to texture
    
 if (g_nViewState == DISPLAY_MODE_OVERLAY ||
    
 g_nViewState == DISPLAY_MODE_DEPTH)
    
 {
    
 const XnDepthPixel* pDepthRow = g_depthMD.Data();
    
 XnRGB24Pixel* pTexRow = g_pTexMap + g_depthMD.YOffset() * g_nTexMapX;
    
  
    
 for (XnUInt y = 0; y < g_depthMD.YRes(); ++y)
    
 {
    
 const XnDepthPixel* pDepth = pDepthRow;
    
 XnRGB24Pixel* pTex = pTexRow + g_depthMD.XOffset();
    
  
    
 for (XnUInt x = 0; x < g_depthMD.XRes(); ++x, ++pDepth, ++pTex)
    
 {
    
 if (*pDepth != 0)
    
 {
    
 int nHistValue = g_pDepthHist[*pDepth];
    
 pTex->nRed = nHistValue;
    
 pTex->nGreen = nHistValue;
    
 pTex->nBlue = 0;
    
 }
    
 }
    
  
    
 pDepthRow += g_depthMD.XRes();
    
 pTexRow += g_nTexMapX;
    
 }
    
 }
    
  
    
 // Create the OpenGL texture map
    
 glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
    
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    
 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, g_nTexMapX, g_nTexMapY, 0, GL_RGB, GL_UNSIGNED_BYTE, g_pTexMap);
    
  
    
 // Display the OpenGL texture map
    
 glColor4f(1,1,1,1);
    
  
    
 glBegin(GL_QUADS);
    
  
    
 int nXRes = g_depthMD.FullXRes();
    
 int nYRes = g_depthMD.FullYRes();
    
  
    
 // upper left
    
 glTexCoord2f(0, 0);
    
 glVertex2f(0, 0);
    
 // upper right
    
 glTexCoord2f((float)nXRes/(float)g_nTexMapX, 0);
    
 glVertex2f(GL_WIN_SIZE_X, 0);
    
 // bottom right
    
 glTexCoord2f((float)nXRes/(float)g_nTexMapX, (float)nYRes/(float)g_nTexMapY);
    
 glVertex2f(GL_WIN_SIZE_X, GL_WIN_SIZE_Y);
    
 // bottom left
    
 glTexCoord2f(0, (float)nYRes/(float)g_nTexMapY);
    
 glVertex2f(0, GL_WIN_SIZE_Y);
    
  
    
 glEnd();
    
  
    
 // Swap the OpenGL display buffers
    
 glutSwapBuffers();
    
 }
    
  
    
 void glutKeyboard (unsigned char key, int x, int y)
    
 {
    
 switch (key)
    
 {
    
 case 27:
    
 exit (1);
    
 case '1':
    
 g_nViewState = DISPLAY_MODE_OVERLAY;
    
 g_depth.GetAlternativeViewPointCap().SetViewPoint(g_image);
    
 break;
    
 case '2':
    
 g_nViewState = DISPLAY_MODE_DEPTH;
    
 g_depth.GetAlternativeViewPointCap().ResetViewPoint();
    
 break;
    
 case '3':
    
 g_nViewState = DISPLAY_MODE_IMAGE;
    
 g_depth.GetAlternativeViewPointCap().ResetViewPoint();
    
 break;
    
 case 'm':
    
 g_context.SetGlobalMirror(!g_context.GetGlobalMirror());
    
 break;
    
 }
    
 }
    
  
    
 int main(int argc, char* argv[])
    
 {
    
 XnStatus rc;
    
  
    
 EnumerationErrors errors;
    
 rc = g_context.InitFromXmlFile(SAMPLE_XML_PATH, g_scriptNode, &errors);
    
 if (rc == XN_STATUS_NO_NODE_PRESENT)
    
 {
    
 XnChar strError[1024];
    
 errors.ToString(strError, 1024);
    
 printf("%s\n", strError);
    
 return (rc);
    
 }
    
 else if (rc != XN_STATUS_OK)
    
 {
    
 printf("Open failed: %s\n", xnGetStatusString(rc));
    
 return (rc);
    
 }
    
  
    
 rc = g_context.FindExistingNode(XN_NODE_TYPE_DEPTH, g_depth);
    
 if (rc != XN_STATUS_OK)
    
 {
    
 printf("No depth node exists! Check your XML.");
    
 return 1;
    
 }
    
  
    
 rc = g_context.FindExistingNode(XN_NODE_TYPE_IMAGE, g_image);
    
 if (rc != XN_STATUS_OK)
    
 {
    
 printf("No image node exists! Check your XML.");
    
 return 1;
    
 }
    
  
    
 g_depth.GetMetaData(g_depthMD);
    
 g_image.GetMetaData(g_imageMD);
    
  
    
 // Hybrid mode isn't supported in this sample
    
 if (g_imageMD.FullXRes() != g_depthMD.FullXRes() || g_imageMD.FullYRes() != g_depthMD.FullYRes())
    
 {
    
 printf ("The device depth and image resolution must be equal!\n");
    
 return 1;
    
 }
    
  
    
 // RGB is the only image format supported.
    
 if (g_imageMD.PixelFormat() != XN_PIXEL_FORMAT_RGB24)
    
 {
    
 printf("The device image format must be RGB24\n");
    
 return 1;
    
 }
    
  
    
 // Texture map init
    
 g_nTexMapX = (((unsigned short)(g_depthMD.FullXRes()-1) / 512) + 1) * 512;
    
 g_nTexMapY = (((unsigned short)(g_depthMD.FullYRes()-1) / 512) + 1) * 512;
    
 g_pTexMap = (XnRGB24Pixel*)malloc(g_nTexMapX * g_nTexMapY * sizeof(XnRGB24Pixel));
    
  
    
 // OpenGL init
    
 glutInit(&argc, argv);
    
 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    
 glutInitWindowSize(GL_WIN_SIZE_X, GL_WIN_SIZE_Y);
    
 glutCreateWindow ("OpenNI Simple Viewer");
    
 glutFullScreen();
    
 glutSetCursor(GLUT_CURSOR_NONE);
    
  
    
 glutKeyboardFunc(glutKeyboard);
    
 glutDisplayFunc(glutDisplay);
    
 glutIdleFunc(glutIdle);
    
  
    
 glDisable(GL_DEPTH_TEST);
    
 glEnable(GL_TEXTURE_2D);
    
  
    
 // Per frame code is in glutDisplay
    
 glutMainLoop();
    
  
    
 return 0;
    
 }
复制代码
 /******************************* * * *OpenNI 1.x Alpha * *Copyright (C) 2011 PrimeSense Ltd. * * * *This file is part of OpenNI. * * * *OpenNI is free software: you can redistribute it and/or modify * *it under the terms of the GNU Lesser General Public License as published * *by the Free Software Foundation, either version 3 of the License, or * *(at your option) any later version.* * * *OpenNI is distributed in the hope that it will be useful,* *but WITHOUT ANY WARRANTY; without even the implied warranty of * *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * *GNU Lesser General Public License for more details.* * * *You should have received a copy of the GNU Lesser General Public License * *along with OpenNI. If not, see <http://www.gnu.org/licenses/>. * * * ***********************************/
    
 //---------------------------------------------------------------------------
    
 // Includes
    
 //---------------------------------------------------------------------------
    
 #include <XnOS.h>
    
 #include <GL/glut.h>
    
 #include <math.h>
    
  
    
 #include <XnCppWrapper.h>
    
 using namespace xn;
    
  
    
 //---------------------------------------------------------------------------
    
 // Defines
    
 //---------------------------------------------------------------------------
    
 #define SAMPLE_XML_PATH "/home/dna/kinect/OpenNI-Bin-Dev-Linux-x64-v1.5.7.10/Samples/Config/SamplesConfig.xml"
    
  
    
 #define GL_WIN_SIZE_X 1280
    
 #define GL_WIN_SIZE_Y 1024
    
  
    
 #define DISPLAY_MODE_OVERLAY 1
    
 #define DISPLAY_MODE_DEPTH 2
    
 #define DISPLAY_MODE_IMAGE 3
    
 #define DEFAULT_DISPLAY_MODE DISPLAY_MODE_DEPTH
    
  
    
 #define MAX_DEPTH 10000
    
  
    
 //---------------------------------------------------------------------------
    
 // Globals
    
 //---------------------------------------------------------------------------
    
 float g_pDepthHist[MAX_DEPTH];
    
 XnRGB24Pixel* g_pTexMap = NULL;
    
 unsigned int g_nTexMapX = 0;
    
 unsigned int g_nTexMapY = 0;
    
  
    
 unsigned int g_nViewState = DEFAULT_DISPLAY_MODE;
    
  
    
 Context g_context;
    
 ScriptNode g_scriptNode;
    
 DepthGenerator g_depth;
    
 ImageGenerator g_image;
    
 DepthMetaData g_depthMD;
    
 ImageMetaData g_imageMD;
    
  
    
 //---------------------------------------------------------------------------
    
 // Code
    
 //---------------------------------------------------------------------------
    
  
    
 void glutIdle (void)
    
 {
    
 // Display the frame
    
 glutPostRedisplay();
    
 }
    
  
    
 void glutDisplay (void)
    
 {
    
 XnStatus rc = XN_STATUS_OK;
    
  
    
 // Read a new frame
    
 rc = g_context.WaitAnyUpdateAll();
    
 if (rc != XN_STATUS_OK)
    
 {
    
 printf("Read failed: %s\n", xnGetStatusString(rc));
    
 return;
    
 }
    
  
    
 g_depth.GetMetaData(g_depthMD);
    
 g_image.GetMetaData(g_imageMD);
    
  
    
 const XnDepthPixel* pDepth = g_depthMD.Data();
    
 const XnUInt8* pImage = g_imageMD.Data();
    
  
    
 unsigned int nImageScale = GL_WIN_SIZE_X / g_depthMD.FullXRes();
    
  
    
 // Copied from SimpleViewer
    
 // Clear the OpenGL buffers
    
 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
  
    
 // Setup the OpenGL viewpoint
    
 glMatrixMode(GL_PROJECTION);
    
 glPushMatrix();
    
 glLoadIdentity();
    
 glOrtho(0, GL_WIN_SIZE_X, GL_WIN_SIZE_Y, 0, -1.0, 1.0);
    
  
    
 // Calculate the accumulative histogram (the yellow display...)
    
 xnOSMemSet(g_pDepthHist, 0, MAX_DEPTH*sizeof(float));
    
  
    
 unsigned int nNumberOfPoints = 0;
    
 for (XnUInt y = 0; y < g_depthMD.YRes(); ++y)
    
 {
    
 for (XnUInt x = 0; x < g_depthMD.XRes(); ++x, ++pDepth)
    
 {
    
 if (*pDepth != 0)
    
 {
    
 g_pDepthHist[*pDepth]++;
    
 nNumberOfPoints++;
    
 }
    
 }
    
 }
    
 for (int nIndex=1; nIndex<MAX_DEPTH; nIndex++)
    
 {
    
 g_pDepthHist[nIndex] += g_pDepthHist[nIndex-1];
    
 }
    
 if (nNumberOfPoints)
    
 {
    
 for (int nIndex=1; nIndex<MAX_DEPTH; nIndex++)
    
 {
    
 g_pDepthHist[nIndex] = (unsigned int)(256 * (1.0f - (g_pDepthHist[nIndex] / nNumberOfPoints)));
    
 }
    
 }
    
  
    
 xnOSMemSet(g_pTexMap, 0, g_nTexMapX*g_nTexMapY*sizeof(XnRGB24Pixel));
    
  
    
 // check if we need to draw image frame to texture
    
 if (g_nViewState == DISPLAY_MODE_OVERLAY ||
    
 g_nViewState == DISPLAY_MODE_IMAGE)
    
 {
    
 const XnRGB24Pixel* pImageRow = g_imageMD.RGB24Data();
    
 XnRGB24Pixel* pTexRow = g_pTexMap + g_imageMD.YOffset() * g_nTexMapX;
    
  
    
 for (XnUInt y = 0; y < g_imageMD.YRes(); ++y)
    
 {
    
 const XnRGB24Pixel* pImage = pImageRow;
    
 XnRGB24Pixel* pTex = pTexRow + g_imageMD.XOffset();
    
  
    
 for (XnUInt x = 0; x < g_imageMD.XRes(); ++x, ++pImage, ++pTex)
    
 {
    
 *pTex = *pImage;
    
 }
    
  
    
 pImageRow += g_imageMD.XRes();
    
 pTexRow += g_nTexMapX;
    
 }
    
 }
    
  
    
 // check if we need to draw depth frame to texture
    
 if (g_nViewState == DISPLAY_MODE_OVERLAY ||
    
 g_nViewState == DISPLAY_MODE_DEPTH)
    
 {
    
 const XnDepthPixel* pDepthRow = g_depthMD.Data();
    
 XnRGB24Pixel* pTexRow = g_pTexMap + g_depthMD.YOffset() * g_nTexMapX;
    
  
    
 for (XnUInt y = 0; y < g_depthMD.YRes(); ++y)
    
 {
    
 const XnDepthPixel* pDepth = pDepthRow;
    
 XnRGB24Pixel* pTex = pTexRow + g_depthMD.XOffset();
    
  
    
 for (XnUInt x = 0; x < g_depthMD.XRes(); ++x, ++pDepth, ++pTex)
    
 {
    
 if (*pDepth != 0)
    
 {
    
 int nHistValue = g_pDepthHist[*pDepth];
    
 pTex->nRed = nHistValue;
    
 pTex->nGreen = nHistValue;
    
 pTex->nBlue = 0;
    
 }
    
 }
    
  
    
 pDepthRow += g_depthMD.XRes();
    
 pTexRow += g_nTexMapX;
    
 }
    
 }
    
  
    
 // Create the OpenGL texture map
    
 glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
    
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    
 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, g_nTexMapX, g_nTexMapY, 0, GL_RGB, GL_UNSIGNED_BYTE, g_pTexMap);
    
  
    
 // Display the OpenGL texture map
    
 glColor4f(1,1,1,1);
    
  
    
 glBegin(GL_QUADS);
    
  
    
 int nXRes = g_depthMD.FullXRes();
    
 int nYRes = g_depthMD.FullYRes();
    
  
    
 // upper left
    
 glTexCoord2f(0, 0);
    
 glVertex2f(0, 0);
    
 // upper right
    
 glTexCoord2f((float)nXRes/(float)g_nTexMapX, 0);
    
 glVertex2f(GL_WIN_SIZE_X, 0);
    
 // bottom right
    
 glTexCoord2f((float)nXRes/(float)g_nTexMapX, (float)nYRes/(float)g_nTexMapY);
    
 glVertex2f(GL_WIN_SIZE_X, GL_WIN_SIZE_Y);
    
 // bottom left
    
 glTexCoord2f(0, (float)nYRes/(float)g_nTexMapY);
    
 glVertex2f(0, GL_WIN_SIZE_Y);
    
  
    
 glEnd();
    
  
    
 // Swap the OpenGL display buffers
    
 glutSwapBuffers();
    
 }
    
  
    
 void glutKeyboard (unsigned char key, int x, int y)
    
 {
    
 switch (key)
    
 {
    
 case 27:
    
 exit (1);
    
 case '1':
    
 g_nViewState = DISPLAY_MODE_OVERLAY;
    
 g_depth.GetAlternativeViewPointCap().SetViewPoint(g_image);
    
 break;
    
 case '2':
    
 g_nViewState = DISPLAY_MODE_DEPTH;
    
 g_depth.GetAlternativeViewPointCap().ResetViewPoint();
    
 break;
    
 case '3':
    
 g_nViewState = DISPLAY_MODE_IMAGE;
    
 g_depth.GetAlternativeViewPointCap().ResetViewPoint();
    
 break;
    
 case 'm':
    
 g_context.SetGlobalMirror(!g_context.GetGlobalMirror());
    
 break;
    
 }
    
 }
    
  
    
 int main(int argc, char* argv[])
    
 {
    
 XnStatus rc;
    
  
    
 EnumerationErrors errors;
    
 rc = g_context.InitFromXmlFile(SAMPLE_XML_PATH, g_scriptNode, &errors);
    
 if (rc == XN_STATUS_NO_NODE_PRESENT)
    
 {
    
 XnChar strError[1024];
    
 errors.ToString(strError, 1024);
    
 printf("%s\n", strError);
    
 return (rc);
    
 }
    
 else if (rc != XN_STATUS_OK)
    
 {
    
 printf("Open failed: %s\n", xnGetStatusString(rc));
    
 return (rc);
    
 }
    
  
    
 rc = g_context.FindExistingNode(XN_NODE_TYPE_DEPTH, g_depth);
    
 if (rc != XN_STATUS_OK)
    
 {
    
 printf("No depth node exists! Check your XML.");
    
 return 1;
    
 }
    
  
    
 rc = g_context.FindExistingNode(XN_NODE_TYPE_IMAGE, g_image);
    
 if (rc != XN_STATUS_OK)
    
 {
    
 printf("No image node exists! Check your XML.");
    
 return 1;
    
 }
    
  
    
 g_depth.GetMetaData(g_depthMD);
    
 g_image.GetMetaData(g_imageMD);
    
  
    
 // Hybrid mode isn't supported in this sample
    
 if (g_imageMD.FullXRes() != g_depthMD.FullXRes() || g_imageMD.FullYRes() != g_depthMD.FullYRes())
    
 {
    
 printf ("The device depth and image resolution must be equal!\n");
    
 return 1;
    
 }
    
  
    
 // RGB is the only image format supported.
    
 if (g_imageMD.PixelFormat() != XN_PIXEL_FORMAT_RGB24)
    
 {
    
 printf("The device image format must be RGB24\n");
    
 return 1;
    
 }
    
  
    
 // Texture map init
    
 g_nTexMapX = (((unsigned short)(g_depthMD.FullXRes()-1) / 512) + 1) * 512;
    
 g_nTexMapY = (((unsigned short)(g_depthMD.FullYRes()-1) / 512) + 1) * 512;
    
 g_pTexMap = (XnRGB24Pixel*)malloc(g_nTexMapX * g_nTexMapY * sizeof(XnRGB24Pixel));
    
  
    
 // OpenGL init
    
 glutInit(&argc, argv);
    
 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    
 glutInitWindowSize(GL_WIN_SIZE_X, GL_WIN_SIZE_Y);
    
 glutCreateWindow ("OpenNI Simple Viewer");
    
 glutFullScreen();
    
 glutSetCursor(GLUT_CURSOR_NONE);
    
  
    
 glutKeyboardFunc(glutKeyboard);
    
 glutDisplayFunc(glutDisplay);
    
 glutIdleFunc(glutIdle);
    
  
    
 glDisable(GL_DEPTH_TEST);
    
 glEnable(GL_TEXTURE_2D);
    
  
    
 // Per frame code is in glutDisplay
    
 glutMainLoop();
    
  
    
 return 0;
    
 }

如果环境搭建成功的话,应该会显示深度图像

至此,软件开发的第一步就搞定了,还有漫漫长路要走,大家继续努力吧!

全部评论 (0)

还没有任何评论哟~