如何从非连续数据生成OpenGL纹理?

时间:2011-01-16 18:03:54

标签: c++ opengl opencv

我的目标是从网络摄像头图像创建纹理。我从 Logitech QuickCam for Notebooks 网络摄像头通过OpenCV的新 VideoCapture 界面获取图像。问题是我以这种方式得到非连续数据,这意味着保存我的图像数据的矩阵的每一行都有一个间隙。

我的图像数据布局如下:

width = frame.cols * frame.elemSize(); // 640 * 3 = 1920 byte
step = frame.step[0]; // 2560 byte
gap = step - width; // 640 byte

但是,我没有找到一种方法告诉OpenGL在加载纹理时跳过每一行的最后640个字节。我想知道是否有办法做到这一点?如果我只是将数据作为纹理加载,图像显示不正确(这里没有意外)。见http://picasaweb.google.com/103165673068768416583/Opencv#5562843683120979026

最好的解决方案是首先获得连续数据,但我再也找不到如何做到这一点(使用OpenCV)。如果我将数据复制到连续矩阵,则会正确显示(参见http://picasaweb.google.com/103165673068768416583/Opencv#5562843692435711522)。

但是,如果我不需要,我不想复制数据。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以尝试GL_UNPACK_ALIGNMENTGL_UNPACK_ROW_LENGTH的组合。

在您的具体情况下,这将给出:

glPixelStorei(GL_UNPACK_ALIGNMENT, 4)         // as 2560 is a multiple of 4
glPixelStorei(GL_UNPACK_ROW_LENGTH, 2560/3)   // to consider each row having this number of pixels

但总而言之,你确定每个像素都有3个字节吗?

我注意到你的stepframe.cols * 4,如果每个像素都有一个填充字节,其对齐方式是4的倍数,我不会感到惊讶。

您是否尝试过指示您的源数据为GL_RGBA或GL_BGRA的OpenGL,同时将纹理内部格式保留为GL_RGB?

相关问题