OpenGL过剩编译失败

时间:2016-01-02 07:59:21

标签: c++ opengl kinect

我正在尝试使用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;
}

0 个答案:

没有答案