C++ 使用OpenCV加载OpenGL的纹理
我看到了许多为OpenGL加载纹理的代码示例,其中许多代码理解起来有点复杂,或者需要使用大量代码的新函数 我认为,由于OpenCV允许我们加载任何图像格式,因此将纹理加载到OpenGL可能是一种简单有效的方法,但我遗漏了一些东西。我在c++中有这段代码: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;
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
ifTEXTURE.cols!=纹理。行
?
glTexImage2D(GL_TEXTURE_2D, 0, 3, texture_cv.cols, texture_cv.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_cv.data);