Загрузка текстуры для OpenGL с OpenCV - PullRequest
6 голосов
/ 03 февраля 2012

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

Я думал, что, поскольку OpenCV позволяет нам загружать любой формат изображения, это может быть простым и эффективным способом загрузки текстур в OpenGL , но я что-то упускаю У меня есть этот кусок кода в c ++ :

cv::Mat texture_cv;
GLuint texture[1];
int Status=FALSE;

if( texture_cv = imread("stones.jpg"))  {

        Status=TRUE;                            // Set The Status To TRUE
        glGenTextures(1, &texture[0]);                  // Create The Texture


        glBindTexture(GL_TEXTURE_2D, texture[0]);               
        glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
        glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
        glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S , GL_REPEAT );
        glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );

        glTexImage2D(GL_TEXTURE_2D, 0, 3, texture_cv.cols, texture_cv.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_cv.data);
}

И он не компилируется из-за этой ошибки:

ошибка C2451: условное выражение типа 'cv :: Mat' недопустимо

Есть предложения? Как мне сделать преобразование из cv :: Mat в текстуру openGL?

Ответы [ 4 ]

8 голосов
/ 03 февраля 2012

Ваша ошибка появляется там, верно?

if( texture_cv = imread("stones.jpg"))  {

потому что в if(expr) expr должен быть bool или может быть приведен к bool. Но нет способа неявно преобразовать cv::Mat в логическое значение. Но вы можете проверить результат imread так:

texture_cv = imread("stones.jpg");
if (texture_cv.empty()) {
  // handle was an error
} else {
  // do right job
} 

См .: cv :: Mat :: empty () , cv :: imread

Надеюсь, это помогло вам.

3 голосов
/ 03 февраля 2012

Оператор присваивания

texture_cv = imread("stones.jpg")

возвращает cv::Mat, который нельзя использовать в условном выражении.Вы должны написать что-то вроде

if((texture_cv = imread("stones.jpg")) != /* insert condition here */ )  {
      //...
}

или

texture = imread("stone.jpg");
if(!texture.empty())  {
          //...
}
2 голосов
/ 03 февраля 2012

из этого документа, я предлагаю вам изменить тест:

texture_cv = imread("stones.jpg");
if (texture_cv.data != NULL)  {
  ...
0 голосов
/ 07 октября 2016

Еще один короткий вопрос ... Я думаю, вам может понадобиться использовать

glTexImage2D(GL_TEXTURE_2D, 0, 3, texture_cv.cols, texture_cv.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_cv.ptr());

вместо

glTexImage2D(GL_TEXTURE_2D, 0, 3, texture_cv.cols, texture_cv.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_cv.data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...