使用OpenCV加载OpenGL的纹理

时间:2012-02-03 08:57:15

标签: 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);
}

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

  

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

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

4 个答案:

答案 0 :(得分:8)

那里出现你的错误,对吧?

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

希望能帮到你。

答案 1 :(得分:3)

赋值运算符

texture_cv = imread("stones.jpg")

返回不能在条件表达式中使用的cv::Mat。你应该写点像

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

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

答案 2 :(得分:2)

来自this doc,我建议您更改测试:

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

答案 3 :(得分:0)

另一个简短的问题...... 我想你可能需要使用

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