我的目标是从网络摄像头图像创建纹理。我从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
最好的解决方案是首先获取continuos数据,但是同样,我也找不到如何执行此操作(使用OpenCV)。如果我将数据复制到continueos矩阵,则可以正确显示(请参阅http://picasaweb.google.com/103165673068768416583/Opencv#5562843692435711522)。
但是,如果不需要,我不想复制数据。有任何想法吗?
最佳答案
您可以尝试结合使用GL_UNPACK_ALIGNMENT
和GL_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个字节吗?
我注意到您的
step
是frame.cols * 4
,如果每个像素都有一个填充字节以使对齐方式是4的倍数,我不会感到惊讶。您是否曾尝试指示OpenGL您的源数据是GL_RGBA或GL_BGRA,同时将纹理内部格式保留为GL_RGB?