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); }
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.