在Visual Studio 2013 C++中使用GLUT渲染Kinect输出(堆栈溢出)



我一直在尝试为项目移植一些有用的代码,但在使GLUT正常工作方面遇到了一些困难。每当调用cbRender函数时,Visual Studio都会弹出一个异常,表示存在堆栈溢出:"KinectBridgeWithOpenCVBasics-D2D.exe中0x00FAD357处的未处理异常:0xC00000FD:堆栈溢出(参数:0x00000000,0x00272000)。"

我试着在cbRender的声明处放置一个断点,通过进入下一步,我进入了一个"chkstk.asm not found"VB页面。

到目前为止,我的主要功能是:

int main(int argc, char** argv) {
HRESULT hr = NuiInitialize(
    NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX
    | NUI_INITIALIZE_FLAG_USES_COLOR);
if (hr != S_OK)
{
    cout << "NuiInitialize failed" << endl;
    return hr;
}
// Initialize Display Mode
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);
// Initialize OpenGL Window
glutInitWindowSize(window_width, window_height);
glutInitWindowPosition(window_xpos, window_ypos);
GLwindow = glutCreateWindow("Kinect Registration");
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
// Initialize OpenCV Window
namedWindow("Camera 0 | Camera 1", CV_WINDOW_AUTOSIZE);
// Setup The GL Callbacks
glutDisplayFunc(cbRender);
glutReshapeFunc(cbReSizeGLScene);
glutKeyboardFunc(cbKeyPressed);
glutMotionFunc(cbMouseMoved);
glutMouseFunc(cbMousePress);
glutTimerFunc(10, cbTimer, 10);
// Setup The CV Callbacks
cvSetMouseCallback("Camera 0 | Camera 1", cbMouseEvent);
glutMainLoop();
NuiShutdown();
return 0;
}

和cbRender函数:

void cbRender() {
    short xyz[window_height][window_width][3];
    unsigned char rgb[window_height][window_width][3];
    unsigned int indices[window_height][window_width];
    //Flush the OpenCV Mat's from last frame
    rgbCV.clear();
    depthCV.clear();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glPushMatrix();
    glScalef(zoom, zoom, 1);
    gluLookAt(0, 0, 3.5, 0, 0, 0, 0, 1.0, 0);
    glRotatef(rotangles[0], 1, 0, 0);
    glRotatef(rotangles[1], 0, 1, 0);
    draw_axes();
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glPointSize(2);
    //--------Camera 0 (P)-----------
    loadBuffers(0, indices, xyz, rgb);
    glVertexPointer(3, GL_SHORT, 0, xyz);
    glColorPointer(3, GL_UNSIGNED_BYTE, 0, rgb);
    glPushMatrix();
    // transform centroid of P to origin and rotate
    transformation(0);
    // projection matrix (camera specific - Can be improved)
    loadVertexMatrix();
    glDrawArrays(GL_POINTS, 0, window_width*window_height);
    glPopMatrix();
    glFlush();
    glutSwapBuffers();
    glDisable(GL_DEPTH_TEST);
}

我意识到大多数实际的代码都隐藏在函数中,如果这些函数中的任何一个可能会导致问题,就说出来,我也会为它们提供代码。

我认为您的代码不会立即出现问题,但我可以给出一些建议:堆栈溢出有两个可能的原因:

  • 通过在自动存储中分配对象,超出了可用堆栈的数量。

  • 一个(集合)函数正在递归地调用它们自己,而没有正确地终止递归。

幸运的是,堆栈溢出非常容易调试:在调试器中运行程序,让堆栈溢出发生,并使用调试器检索回溯/堆栈跟踪。这将准确地显示是哪个函数调用导致了问题。

最新更新