我正在尝试使用OpenGL从kinect中绘制图片。关注this article
我正在使用visual studio 2012,并在链接器属性
中链接了freeglut.lib我还将.dll文件放到我的System32和SysWOW64目录
编译时遇到这些错误:
Error 9 error LNK2019: unresolved external symbol __imp__NuiGetSensorCount@4 referenced in function "bool __cdecl initKinect(void)" (?initKinect@@YA_NXZ)
Error 10 error LNK2019: unresolved external symbol __imp__NuiCreateSensorByIndex@8 referenced in function "bool __cdecl initKinect(void)" (?initKinect@@YA_NXZ)
Error 4 error LNK2019: unresolved external symbol __imp__glutSwapBuffers@0 referenced in function "void __cdecl draw(void)" (?draw@@YAXXZ)
Error 3 error LNK2019: unresolved external symbol __imp__glutMainLoop@0 referenced in function "void __cdecl execute(void)" (?execute@@YAXXZ)
Error 1 error LNK2019: unresolved external symbol __imp__glutInitWindowSize@8 referenced in function "bool __cdecl init(int,char * * const)" (?init@@YA_NHQAPAD@Z)
Error 2 error LNK2019: unresolved external symbol __imp__glutInitDisplayMode@4 referenced in function "bool __cdecl init(int,char * * const)" (?init@@YA_NHQAPAD@Z)
Error 5 error LNK2019: unresolved external symbol __imp__glutIdleFunc@4 referenced in function "bool __cdecl init(int,char * * const)" (?init@@YA_NHQAPAD@Z)
Error 6 error LNK2019: unresolved external symbol __imp__glutDisplayFunc@4 referenced in function "bool __cdecl init(int,char * * const)" (?init@@YA_NHQAPAD@Z)
Error 7 error LNK2019: unresolved external symbol __imp____glutInitWithExit@12 referenced in function _glutInit_ATEXIT_HACK@8
Error 8 error LNK2019: unresolved external symbol __imp____glutCreateWindowWithExit@8 referenced in function _glutCreateWindow_ATEXIT_HACK@4
Error 11 error LNK1120: 10 unresolved externals
以下是代码:
#include <iostream>
#include <Windows.h>
#include <Ole2.h>
#include <gl/GL.h>
#include <gl/GLU.h>
#include <glut.h>
#include <NuiApi.h>
#include <NuiImageCamera.h>
#include <NuiSensor.h>
using namespace std;
#define width 640
#define height 480
#define GL_BGRA 0x80E1
// 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
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;
}
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 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();
}
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;
}
int main(int argc, char* argv[]) {
if (!init(argc, argv)) return 1;
if (!initKinect()) return 1;
/* ...OpenGL texture and camera initialization... */
// 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();
// Main loop
execute();
return 0;
}