Как использовать функцию openCv setOpenGlDrawCallback? - PullRequest
1 голос
/ 18 января 2012

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

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;
}

1 Ответ

1 голос
/ 18 января 2012

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

imshow(winname, NULL);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...