使用OpenCV加载OpenGL的纹理

Jav*_*ock 6 c++ opengl opencv textures

我已经看到许多代码示例用于为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);
}
Run Code Online (Sandbox Code Playgroud)

由于这个错误,它没有编译:

错误C2451:类型'cv :: Mat'的条件表达式是非法的

有什么建议?我该如何从cv :: Mat转换为openGL纹理?

And*_* D. 8

你的错误出现在那里,对吗?

if( texture_cv = imread("stones.jpg"))  {
Run Code Online (Sandbox Code Playgroud)

因为在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
} 
Run Code Online (Sandbox Code Playgroud)

请参阅:cv :: Mat :: empty(),cv :: imread

希望对你有所帮助.