简体   繁体   中英

Loading texture for OpenGL with OpenCV

I have seen many code samples for loading textures for OpenGL , many of them a bit complicated to understand or requiring new functions with a lot of code.

I was thinking that as OpenCV allows us to load any image format it can be a simple an efficient way to load textures to OpenGL , but I am missing something. I have this piece of code in 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);
}

And it is not compiling because of this error:

error C2451: conditional expression of type 'cv::Mat' is illegal

Any suggestions? How should I do the conversion from cv::Mat to openGL texture?

Your error appears there, right?

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

because in if(expr) expr must be bool or can be casted to bool . But there is no way to convert cv::Mat into boolean implicitly. But you can check the result of imread like that:

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

See: cv::Mat::empty() , cv::imread

Hope that helped you.

The assignment operator

texture_cv = imread("stones.jpg")

returns a cv::Mat that can't be used in a conditional expression. You should write something like

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

or

texture = imread("stone.jpg");
if(!texture.empty())  {
          //...
}

from this doc, I suggest you to change your test:

texture_cv = imread("stones.jpg");
if (texture_cv.data != NULL)  {
  ...

Another short question... I think you may need to use

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

instead of

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM