[英]Loading texture for OpenGL with OpenCV
我已经看到许多代码示例用于为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必须是bool
或者可以被转换为bool
。 但是没有办法隐式地将cv::Mat
转换为boolean。 但你可以检查imread
的结果:
texture_cv = imread("stones.jpg");
if (texture_cv.empty()) {
// handle was an error
} else {
// do right job
}
请参阅: cv :: Mat :: empty() , cv :: imread
希望对你有所帮助。
赋值运算符
texture_cv = imread("stones.jpg")
返回一个不能在条件表达式中使用的cv::Mat
。 你应该写类似的东西
if((texture_cv = imread("stones.jpg")) != /* insert condition here */ ) {
//...
}
要么
texture = imread("stone.jpg");
if(!texture.empty()) {
//...
}
从这个文档,我建议你改变你的测试:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.