我一直在尝试为项目移植一些有用的代码,但在使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);
}
我意识到大多数实际的代码都隐藏在函数中,如果这些函数中的任何一个可能会导致问题,就说出来,我也会为它们提供代码。
我认为您的代码不会立即出现问题,但我可以给出一些建议:堆栈溢出有两个可能的原因:
-
通过在自动存储中分配对象,超出了可用堆栈的数量。
-
一个(集合)函数正在递归地调用它们自己,而没有正确地终止递归。
幸运的是,堆栈溢出非常容易调试:在调试器中运行程序,让堆栈溢出发生,并使用调试器检索回溯/堆栈跟踪。这将准确地显示是哪个函数调用导致了问题。