Draw the RGB data from kinect C++ via opengl
2017-06-17 14:41
447 查看
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:
Constants and global variables:
Kinect Initialization:
get an RGB frame from the Kinect:
Something about the window:
Display via OpenGL:
Draw a frame to the screen:
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.
-------------------------------------------------------------------------------------------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.
相关文章推荐
- Draw the RGB data from kinect C++ via opengl
- Android - How to direct the audio data from MediaRecorder as the input of ffmpeg command via Pipe?
- 如何用C++递归来实现copy even data from the original BST
- Getting Data From the Web (URLConnection via http)
- Get the webpage data from URI.
- How to eliminate the compile error "conversion from 'double ' to 'float ', possible loss of data"
- Adivce from the father of C++
- Inside The C++ Object Model ---- The Semantics of Data
- Adivce from the father of C++
- How to get the password text in a text with password property from another process using C++ - 用C++如何从不同进程获取密码框文本
- Compare Data from the Same Table in two Different Environments
- 译《Understanding Microsoft Virtualization Solutions—From the Desktop to the Datacenter》-之序
- using JS to control two select(html),the data can be loaded from database and XML,and show in the select
- Trick: 巧用.NET Reflection从SqlConnection回溯到打开着的SqlDataReader。(Find the live SqlDataReader from SqlConnection)
- platform builder was unable to read the device settings from the datastore问题解决
- Digital Data Integrity: The Evolution from Passive Protection to Active Management
- Advanced Visual Effects with OpenGL - Inside the GDC 2006(From GameDev.net)
- using INSTR function for obtaining data from a table, based on a selection from the master table (FK relation)
- A simple Example of data processing from Excel as the datasource
- 译《Understanding Microsoft Virtualization Solutions―From the Desktop to the Datacenter》-之序