2012-01-18 3 views
1

Я использую библиотеку OpenCV 2.3.2, загруженную с соединительной линии OpenCV. Я хочу использовать функцию setOpenGlDrawCallback для отображения сцены OpenGL. Когда я компилирую нижеприведенный простой код, у меня возникают следующие ошибки:Как использовать opencv setOpenGlDrawCallback функция?

OpenCV Error: Assertion failed (depth >= 0 && depth <= CV_32F) in unknown function, file ..\..\..\opencv\modules\core\src\opengl_interop.cpp, line 736 

Что пошло неправильно на этот код?

// углы поворота 
float angx=55, angy=45; 
float angstep=10; 

String winname = "opengl"; 

// opengl callback 
void on_opengl(void* param) 
{ 
    glLoadIdentity(); 

    glTranslated(0.0, 0.0, -1.0); 

    glRotatef(angx, 1, 0, 0); 
    glRotatef(angy, 0, 1, 0); 
    glRotatef(0, 0, 0, 1); 

    static const int coords[6][4][3] = { 
     { { +1, -1, -1 }, { -1, -1, -1 }, { -1, +1, -1 }, { +1, +1, -1 } }, 
     { { +1, +1, -1 }, { -1, +1, -1 }, { -1, +1, +1 }, { +1, +1, +1 } }, 
     { { +1, -1, +1 }, { +1, -1, -1 }, { +1, +1, -1 }, { +1, +1, +1 } }, 
     { { -1, -1, -1 }, { -1, -1, +1 }, { -1, +1, +1 }, { -1, +1, -1 } }, 
     { { +1, -1, +1 }, { -1, -1, +1 }, { -1, -1, -1 }, { +1, -1, -1 } }, 
     { { -1, -1, +1 }, { +1, -1, +1 }, { +1, +1, +1 }, { -1, +1, +1 } } 
    }; 

    for (int i = 0; i < 6; ++i) { 
     glColor3ub(i*20, 100+i*10, i*42); 
     glBegin(GL_QUADS); 
     for (int j = 0; j < 4; ++j) { 
      glVertex3d(0.2 * coords[i][j][0], 0.2 * coords[i][j][1], 0.2 * coords[i][j][2]); 
     } 
     glEnd(); 
    } 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

     namedWindow(winname,CV_WINDOW_OPENGL | CV_WINDOW_FREERATIO | CV_GUI_NORMAL); 
    setOpenGlDrawCallback(winname.c_str(),on_opengl);** 

    while (true) 
    { 
     char key = (char)waitKey(10); 

     if(key == 27) 
      break; 

     // вращаем 
     switch(key) 
     { 
     case 'w': 
      angx+=angstep; 
      break; 
     case 's': 
      angx-=angstep; 
      break; 
     case 'a': 
      angy+=angstep; 
      break; 
     case 'd': 
      angy-=angstep; 
      break; 
     } 
     // обновить рендер 
     imshow(winname, NULL); 
    } 

    return 0; 
} 
+0

Какая именно строка вашего кода вызывает эту ошибку? Откройте отладчик и узнайте. Кроме того, в примере ** point_cloud.cpp ** показано, как использовать 'setOpenGlDrawCallback()'. – karlphillip

+1

Добро пожаловать в StackOverflow, надеюсь, вы прочитали [FAQ] (http://stackoverflow.com/faq#howtoask). –

ответ

1

Я думаю, что проблема является линия

imshow(winname, NULL); 

Кажется, что вы хотите, чтобы открыть окно без отображения изображения. Но если посмотреть на cv::imshow's signtaure, это не сработает, так как оно ожидает const cv::Mat&. Так что, вероятно, сделано так, что NULL преобразуется в cv::Mat с использованием одного из его конструкторов, наиболее вероятно ожидающего const IplImage*. Но этот указатель изображения - это нулевой указатель, из-за которого конструктор терпит неудачу.

+0

+1 Действительно, это наверняка вызовет проблемы. – karlphillip

Смежные вопросы