【发布时间】:2016-08-03 00:07:03
【问题描述】:
我一直在寻找一种将 OpenGL 纹理转换为 OpenCV 矩阵类型的方法。我找到了许多指南,这些指南显示了从 OpenCV 矩阵到 OpenGL 纹理的转换,但遗憾的是相反。我还通读了this 及其answer,但这并没有让我变得更聪明。我正在用 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 = textureToMat(texture);
namedWindow("Raytrix feed", WINDOW_AUTOSIZE);
imshow("Raytrix feed", out);
waitKey(0);
return 0;
}
纹理.cpp:
Mat textureToMat(GLuint texture_id) {
glBindTexture(GL_TEXTURE_2D, texture_id);
GLenum texture_width, texture_height;
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, (GLint*)&texture_width);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, (GLint*)&texture_height);
unsigned char* texture_bytes = (unsigned char*)malloc(sizeof(unsigned char)*texture_width*texture_height * 4);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture_bytes);
return Mat(texture_height, texture_width, CV_8UC4, texture_bytes);
}
void drawGLTexture(GLFWwindow *window) {
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_TRIANGLES);
glTexCoord2f(0, 1);
glVertex2f(-1, -1);
glTexCoord2f(1, 1);
glVertex2f(1, -1);
glTexCoord2f(0, 0);
glVertex2f(-1, 1);
glTexCoord2f(1, 1);
glVertex2f(1, -1);
glTexCoord2f(1, 0);
glVertex2f(1, 1);
glTexCoord2f(0, 0);
glVertex2f(-1, 1);
glEnd();
glfwSwapBuffers(window);
glfwPollEvents();
glFlush();
glFinish();
}
标题:
#ifndef TEXTURE_H
#define TEXTURE_H
#include "glew.h"
#include "glfw3.h"
#include <string>
#include <iostream>
#include <vector>
#include <opencv\highgui.h>
#include <opencv\cv.h>
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;
Mat textureToMat(GLuint textureID);
void drawGLTexture(GLFWwindow *window);
#endif /*!TEXTURE_H*/
【问题讨论】:
-
此外,您链接的答案几乎向您展示了正确的方法,您觉得其中哪一部分难以理解?
-
没错。现在是凌晨,我的咖啡还没喝,我会更新帖子。
-
对我来说很难看出纹理 id 的使用位置。假设我在 OpenGL 中加载图像并获取其纹理 id,如何将其转换为 OpenCV 矩阵?
-
@ThorbjørnSømod:通过返回两步,甚至在将纹理加载到 OpenGL 并将数据直接放入 OpenCV 矩阵之前。 OpenGL 不处理图像文件格式,事实上许多人实际上使用 OpenCV 来加载图像文件(OpenCV 与 OpenGL 不同,确实知道如何处理图像文件和格式)并加载生成 OpenCV 到 OpenGL 的垫子。当然,如果您想使用 OpenGL 生成图像以使用 OpenCV 处理它们,那么您必须读回图像数据,这就是
glReadPixels的用途。但这通常不涉及纹理。 -
感谢您的意见,但这不是我想要的。基本上我所拥有的是一个系统,它将输出由纹理 ID 给出的图像。我想要的是将此图像加载到 OpenCV 中,以便我可以在那里对其执行各种操作。我不能直接将它加载到 OpenCV 中,它必须通过纹理 ID。