我想通过glReadPixels()从动画中获取每个OpenGL帧,并将数据转换为OpenCV :: Mat.我知道glReadPixels()从左到右按行从下一行到上一行获取数据.另一方面,OpenCV以不同方式存储数据.
有没有人知道任何库或任何帮助我将数据从glReadPixels转换为OpenCV的教程/示例: C++中的Mat?
摘要
OpenGL frame -----------------------> CV::Mat
Data from left to right, Data from left to right,
bottom to top. top to bottom.
Run Code Online (Sandbox Code Playgroud) 我已经看到许多代码示例用于为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);
}
Run Code Online (Sandbox Code Playgroud)
由于这个错误,它没有编译:
错误C2451:类型'cv :: Mat'的条件表达式是非法的
有什么建议?我该如何从cv :: Mat转换为openGL纹理?
我一直在寻找一种将OpenGL纹理转换为OpenCV矩阵类型的方法。我发现了许多指南,这些指南显示了从OpenCV矩阵到OpenGL纹理的转换,但不幸的是却没有相反的方法。我也阅读了此内容及其答案,但并没有使我变得更明智。我正在用C ++编写并使用OpenCV3.1和OpenGL4.4。
编辑:更新的代码
main.cpp:
#include "CameraCapture.h"
#include "GUIMainWindow.h"
#include "glfw3.h"
#include "Texture.h"
using namespace std;
int main(int argc, char* argv[]) {
if (!glfwInit()) {
fprintf(stderr, "Failed to initialize GLFW \n");
return -1;
}
glfwWindowHint(GLFW_VISIBLE, GL_FALSE);
GLFWwindow* window = glfwCreateWindow(1929, 1341, "OpenGL", NULL, NULL);
if (window == NULL) {
fprintf(stderr, "Failed to make GLFW window.");
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
CameraCapture *cc = new CameraCapture();
cc->CameraCapture::AvailableCameras();
GLuint texture = cc->CameraCapture::OpenCamera(0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
drawGLTexture(window);
Mat out = …Run Code Online (Sandbox Code Playgroud)