• 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.

  • 相关阅读:
    java并发容器
    实现个简单的线程池
    【hdu 3501 (数论、欧拉函数)】
    【关于Java学习的几点看法】
    【乘法游戏】
    【hdu 1280 前m大的数】
    【最大因子数】
    【ECJTU_ACM 11级队员2012年暑假训练赛(7) C Fire Net】
    【ACM ICPC Fighting!!!!!!!!!!!!!】
    【firefly 默默最喜欢的歌】
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7040199.html
Copyright © 2020-2023  润新知