C++ 使用OpenCV加载OpenGL的纹理

C++ 使用OpenCV加载OpenGL的纹理,c++,opengl,opencv,textures,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;

我看到了许多为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纹理?

您的错误出现在那里,对吗

if( texture_cv = imread("stones.jpg"))  {
因为在
if(expr)
expr中,expr必须是
bool
,或者可以强制转换为
bool
。但无法将
cv::Mat
隐式转换为布尔值。但是您可以像这样检查
imread
的结果:

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


希望对您有所帮助。

作业操作员

texture_cv = imread("stones.jpg")
返回不能在条件表达式中使用的
cv::Mat
。你应该写一些类似的东西

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

从doc,我建议您更改您的测试:

texture_cv = imread("stones.jpg");
if (texture_cv.data != NULL)  {
  ...
另一个简短的问题。。。 我想你可能需要使用

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

我认为使用OpenCV加载纹理是过分的。有一个专门为此设计的库魔鬼。我在我的项目中使用OpenCV,我不断地从opengl转换到OpenCV数据,这就是为什么我想到了减少库的想法。无论如何,感谢魔鬼,我会看看它。FreeImage也是魔鬼的另一个(更近期的)替代品=)如果不是
GL\u TEXTURE\u RECTANGLE
if
TEXTURE.cols!=纹理。行
glTexImage2D(GL_TEXTURE_2D, 0, 3, texture_cv.cols, texture_cv.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_cv.data);