gpt4 book ai didi

c++ - OpenCV IplImage *图像到 OpenGL GLuint 纹理

转载 作者:太空狗 更新时间:2023-10-29 20:59:58 25 4
gpt4 key购买 nike

我正在尝试使用 OpenGL/GLFW 和 OpenCV 在两个屏幕上同时显示视频。当我在我的笔记本电脑(2010 年中期 13"Macbook Pro)和外部屏幕上测试我的代码时,程序工作正常(减去视频以非常快的 FPS 播放的事实 - 任何也能解决这个问题的人都会非常有帮助。它也是颠倒的,但 OpenCV 可以很好地翻转。)但是当我将我的代码移动到 2008 年初的 Mac Pro 并运行代码时,图像似乎没有正确纹理。下图:

The three color channels take up different columns

由于某种原因,三个颜色的记录被分成不同的列并且框架不正确。它应该是这样的:

Better image

图像的位置无关紧要,这只是因为屏幕大小不同。我想知道以前是否有人见过这个问题,它是否只是我调用 glTexImage2D 的方式的问题?下面发布的是我正在使用的代码。

#include <stdio.h>
#include <string.h>

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv2/imgproc/imgproc.hpp>

#include <GLFW/glfw3.h>
#include <GLUT/glut.h>

#define VIEWPORT_WIDTH 1280
#define VIEWPORT_HEIGHT 800
#define KEY_ESCAPE 27

CvCapture* capture;
GLFWwindow* window1;
GLFWwindow* window2;
IplImage *image;
static GLuint texName;

void initTexture(IplImage* Image);
void applyTexture(int img_width, int img_height);
void loadImage(IplImage*, GLFWwindow* window);

int main(int argc, char* argv[])
{

if (!glfwInit())
exit(EXIT_FAILURE);

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(VIEWPORT_WIDTH, VIEWPORT_HEIGHT);

int count;
GLFWmonitor** monitors = glfwGetMonitors(&count);
window1 = glfwCreateWindow(VIEWPORT_WIDTH, VIEWPORT_HEIGHT, "Simple example1", monitors[0], NULL);
window2 = glfwCreateWindow(VIEWPORT_WIDTH, VIEWPORT_HEIGHT, "Simple example2", monitors[1], NULL);

capture = cvCaptureFromAVI("../VideoTexture/movie.mov");
assert(capture);
// Initialize OpenGL
glfwMakeContextCurrent(window1);


while (!glfwWindowShouldClose(window1))
{
image = cvQueryFrame(capture);
if(!cvGrabFrame(capture)){ // capture a frame
printf("Could not grab a frame\n\7");
exit(0);
}


glfwMakeContextCurrent(window1);
loadImage(image, window1);
glfwMakeContextCurrent(window2);
loadImage(image, window2);

}


return 0;


}

void initTexture(IplImage *Image)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);

glGenTextures(1, &texName);
glBindTexture(GL_TEXTURE_2D, texName);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glTexImage2D(GL_TEXTURE_2D, 0, 3, Image->width, Image->height, 0, GL_BGR, GL_UNSIGNED_BYTE, Image->imageData);
}

void applyTexture(int img_width, int img_height)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glBindTexture(GL_TEXTURE_2D, texName);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(VIEWPORT_WIDTH /2, VIEWPORT_HEIGHT/2, 0);
glTexCoord2f(0, 1); glVertex3f(VIEWPORT_WIDTH /2, VIEWPORT_HEIGHT/2+img_height, 0);
glTexCoord2f(1, 1); glVertex3f(VIEWPORT_WIDTH /2+img_width, VIEWPORT_HEIGHT/2+img_height, 0);
glTexCoord2f(1, 0); glVertex3f(VIEWPORT_WIDTH /2+img_width, VIEWPORT_HEIGHT/2, 0);
glEnd();
glFlush();
glDisable(GL_TEXTURE_2D);
}

void loadImage(IplImage *Image, GLFWwindow* window)
{
initTexture(Image);
glViewport(0, 0, VIEWPORT_WIDTH , VIEWPORT_HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, VIEWPORT_WIDTH , 0, VIEWPORT_HEIGHT, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
applyTexture(Image->width,Image->height);
glfwSwapBuffers(window);
glfwPollEvents();
}

已解决:

添加以下两行解决了这个问题。

glPixelStorei (GL_UNPACK_ALIGNMENT,  Image->align);
glPixelStorei (GL_UNPACK_ROW_LENGTH, Image->widthStep / Image->nChannels);

最佳答案

当您向/从 GL 发送/读取 RGB 图像时,您需要将像素解包/打包对齐设置为 1。默认情况下,GL 将读取您的图像数据,就好像每一行都与 4 字节边界对齐,而对于紧密压缩的(8 位)RGB 显然不是这种情况。

这至少可以解决您的部分问题:

glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
glTexImage2D (GL_TEXTURE_2D, 0, 3, Image->width, Image->height, 0, GL_BGR, GL_UNSIGNED_BYTE, Image->imageData);


更新:

IplImage data structure提供您需要的所有字段,以便可移植地执行此操作:

glPixelStorei (GL_UNPACK_ALIGNMENT,  Image->align);
glPixelStorei (GL_UNPACK_ROW_LENGTH, Image->widthStep / Image->nChannels);
glTexImage2D (GL_TEXTURE_2D, 0, 3, Image->width, Image->height, 0, GL_BGR, GL_UNSIGNED_BYTE, Image->imageData);

但是,基本问题是相同的。这归结为两台机器之间图像数据对齐的差异。

至于你的图像是颠倒的,请查看 IplImage 结构的 origin 字段。你需要自己补偿。不幸的是,GL 无法在像素传输期间翻转图像。

关于c++ - OpenCV IplImage *图像到 OpenGL GLuint 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23324742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com