我已经看到很多用于加载 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纹理?
答案 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);