【问题标题】:Loading texture for OpenGL with OpenCV使用 OpenCV 为 OpenGL 加载纹理
【发布时间】:2012-02-03 08:57:14
【问题描述】:

我已经看到许多用于为 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 纹理的转换?

【问题讨论】:

  • 我认为使用 OpenCV 加载纹理太过分了。有专门为此设计的库 DevIL。
  • 我在我的项目中使用 OpenCV,并且我不断地从 opengl 更改为 opencv 数据,这就是为什么我有了减少库的想法。无论如何感谢 DevIL,我会看看它。
  • FreeImage 也是 DevIL 的另一个(更新的)替代品 =)
  • 如果texture.cols != texture.rows 不应该是GL_TEXTURE_RECTANGLE 吗?

标签: c++ opengl opencv textures


【解决方案1】:

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

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

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    赋值运算符

    texture_cv = imread("stones.jpg")
    

    返回一个不能在条件表达式中使用的cv::Mat。你应该写类似

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

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

    【讨论】:

      【解决方案3】:

      来自this doc,我建议你改变你的测试:

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

      【讨论】:

        【解决方案4】:

        另一个简短的问题... 我认为您可能需要使用

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

        【讨论】:

          猜你喜欢
          • 2013-05-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多