zoukankan      html  css  js  c++  java
  • Draw the RGB data from kinect C++ via opengl

    In order to improve my English writing skills,I am going to  write the blogs in English form now!

    -------------------------------------------------------------------------------------------Luxuriant line-----------------------------------------------------------------------

    Today,we will learn how to initialize the kinect and get RGB data form it,then convert the data to a texture,which will be drawn to the windows.

    We have two real pieces of kinect-specific code. I will go over these in some detail, and give a fairly hight level overview of the display code


    include the header files:

    #include <Windows.h>
    #include <Ole2.h>
    
    #include <gl/GL.h>
    #include <gl/GLU.h>
    #include <gl/glut.h>
    
    #include <NuiApi.h>
    #include <NuiImageCamera.h>
    #include <NuiSensor.h>

    Constants and global variables:

    #define width 640
    #define height 480
    
    // OpenGL Variables
    GLuint textureId;              // ID of the texture to contain Kinect RGB Data
    GLubyte data[width*height*4];  // BGRA array containing the texture data
    
    // Kinect variables
    HANDLE rgbStream;              // The identifier of the Kinect's RGB Camera
    INuiSensor* sensor;            // The kinect sensor

    Kinect Initialization:

    bool initKinect() {
        // Get a working kinect sensor
        int numSensors;
        if (NuiGetSensorCount(&numSensors) < 0 || numSensors < 1) return false;
        if (NuiCreateSensorByIndex(0, &sensor) < 0) return false;
    
        // Initialize sensor
        sensor->NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH | NUI_INITIALIZE_FLAG_USES_COLOR);
        sensor->NuiImageStreamOpen(
            NUI_IMAGE_TYPE_COLOR,            // Depth camera or rgb camera?
            NUI_IMAGE_RESOLUTION_640x480,    // Image resolution
            0,      // Image stream flags, e.g. near mode
            2,      // Number of frames to buffer
            NULL,   // Event handle
            &rgbStream);
        return sensor;
    }

    get an RGB frame from the Kinect:

    void getKinectData(GLubyte* dest) {
        NUI_IMAGE_FRAME imageFrame;
        NUI_LOCKED_RECT LockedRect;
        if (sensor->NuiImageStreamGetNextFrame(rgbStream, 0, &imageFrame) < 0) return;
        INuiFrameTexture* texture = imageFrame.pFrameTexture;
        texture->LockRect(0, &LockedRect, NULL, 0);
     if (LockedRect.Pitch != 0)
        {
            const BYTE* curr = (const BYTE*) LockedRect.pBits;
            const BYTE* dataEnd = curr + (width*height)*4;
    
            while (curr < dataEnd) {
                *dest++ = *curr++;
            }
        }
      texture->UnlockRect(0);
        sensor->NuiImageStreamReleaseFrame(rgbStream, &imageFrame);
    }


    Something about the window:

    void draw() {
       drawKinectData();
       glutSwapBuffers();
    }
    
    void execute() {
        glutMainLoop();
    }
    
    bool init(int argc, char* argv[]) {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
        glutInitWindowSize(width,height);
        glutCreateWindow("Kinect SDK Tutorial");
        glutDisplayFunc(draw);
        glutIdleFunc(draw);
        return true;
    }

    Display via OpenGL:

      // Initialize textures
        glGenTextures(1, &textureId);
        glBindTexture(GL_TEXTURE_2D, textureId);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height,
                     0, GL_BGRA, GL_UNSIGNED_BYTE, (GLvoid*) data);
        glBindTexture(GL_TEXTURE_2D, 0);
    
        // OpenGL setup
        glClearColor(0,0,0,0);
        glClearDepth(1.0f);
        glEnable(GL_TEXTURE_2D);
    
        // Camera setup
        glViewport(0, 0, width, height);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, width, height, 0, 1, -1);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

    int main(int argc, char* argv[]) {
        if (!init(argc, argv)) return 1;
        if (!initKinect()) return 1;
        
        /* ...OpenGL texture and camera initialization... */
    
        // Main loop
        execute();
        return 0;
    }

    Draw a frame to the screen:

    void drawKinectData() {
        glBindTexture(GL_TEXTURE_2D, textureId);
        getKinectData(data);
        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, (GLvoid*)data);
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glBegin(GL_QUADS);
            glTexCoord2f(0.0f, 0.0f);
            glVertex3f(0, 0, 0);
            glTexCoord2f(1.0f, 0.0f);
            glVertex3f(width, 0, 0);
            glTexCoord2f(1.0f, 1.0f);
            glVertex3f(width, height, 0.0f);
            glTexCoord2f(0.0f, 1.0f);
            glVertex3f(0, height, 0.0f);
        glEnd();
    }
        

    The End! Build and run,making sure that your Kinect is plugged in.You should see a window containing a viseo stream of what your Kinect sees.

  • 相关阅读:
    thinkphp的钩子的两种配置和两种调用方法
    php闭包实现函数的自调用,也是递归
    php的spl_autoload_register函数的一点个人见解
    详解js变量、作用域及内存
    关于js的call()和apply()两个函数的一点个人看法
    php实现斐波那契数列以及由此引起的联想
    php猴子称王或者约瑟夫难题
    Linux Bash Shell 快速入门
    Fedora14下首次搭建Samba服务器遇到的一些问题
    【JavaScript】我的JavaScript技术总结第一篇——编程细节
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7040199.html
Copyright © 2011-2022 走看看