OpenCV OpenGLDrawCallback не вызывается - PullRequest
0 голосов
/ 29 мая 2018

Я инициализирую окно OpenCV с помощью следующего кода:

cv::VideoCapture * stream = new cv::VideoCapture("stream_ip");
if (!stream->isOpened()){ 
    printf("Couldn't open stream! %s\n", strerror(errno));
}

//We create window with OpenGL enabled.
cv::namedWindow("rtsp_stream", cv::WINDOW_OPENGL);

//Make it fullscreen (I also tried with fixed screen size without luck.)
cv::setWindowProperty("rtsp_stream", cv::WND_PROP_FULLSCREEN, cv::WINDOW_FULLSCREEN);

//Set OpenGL context to use this window.
cv::setOpenGlContext("rtsp_stream");

//Set openGlDrawCallback.
cv::setOpenGlDrawCallback("rtsp_stream", on_opengl, NULL);

//This is the material that the image will be rendered on.
cv::Mat frame;
char k;
bool continueStream = true;

while (continueStream) {

    //We read data from the stream and write it on the frame.
    if((stream->read(frame)) != 0){
        //Then we display/render the image using imshow.
        cv::imshow("rtsp_stream", frame);
        k = cv::waitKey(1);

        //I'm not sure if updateWindow needs to be manually called to make openGLDrawCallback or if imshow calls it automatically after done rendering. So I have tried with and without it.
        //cv::updateWindow("rtsp_stream");

        switch(k){
        case 0x1b: //ESC key
            printf("Closing stream.\n");
            continueStream = false;
            break;
        }
    }
}

open_gl Функция просто печатает некоторый текст, чтобы увидеть, вызывается ли opengldrawcallback.Я также удостоверился, что на моем OpenCV включены OpenGL и QT с std::cout << cv::getBuildInformation() << std::endl;.Я пытался найти решения на разных сайтах и ​​в разных источниках, включая эту книгу .Программа работает как положено во всех отношениях, за исключением того, что openglcallback никогда не вызывается.Вся помощь очень ценится.

1 Ответ

0 голосов
/ 30 мая 2018

Хорошо.как я вчера узнал, cv::imshow не позволил мне использовать команды OpenGL в этом окне.

Итак, что мне нужно было сделать, чтобы преодолеть это, было прочитать данные на cv::Mat, как и раньше,Но вместо того, чтобы визуализировать cv::Mat прямо в окне, используя cv::imshow, мне пришлось сначала сохранить данные на текстуре, а затем отобразить эту текстуру на экране.Для хранения данных на текстуре я использовал следующий метод:

/**
*texture: Pointer to OpenGL texture that we want to render our stream on.
*data: cv::Mat that contains the data we want to render.
**/
void storeStreamToTexture(GLuint texture, cv::Mat* data){
    //Bind the texture we want to render to.
    glBindTexture(GL_TEXTURE_2D, texture);
    //we flip the Mat to start reading from the beginning.
    cv::flip(*data, *data, 0);
    //Store mat data to our texture.
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, data->cols, data->rows, 0, GL_BGR, GL_UNSIGNED_BYTE, data->data);
}

И после этого мы можем использовать нашу текстуру так же, как мы использовали бы любую другую текстуру в OpenGL.Надеюсь, кто-то найдет это полезным в будущем!:)

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