OpenGL中的OpenCV图像:奇怪的行为

时间:2012-03-13 23:45:08

标签: c++ opengl opencv texture-mapping iplimage

我正在使用以下代码从IplImage创建和显示纹理。它的工作时间大约是一半,但有时会使图像偏斜,我认为它与纹理填充有关,但我需要帮助修复。

int loadTexture_Ipl(IplImage *image, GLuint *text) {
    if (image==NULL) return -1;
    glGenTextures(1, text);
    glBindTexture( GL_TEXTURE_2D, *text );
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image->width, image->height,0, GL_BGR, GL_UNSIGNED_BYTE, image->imageData);
    return 0;
}

此链接是输出的屏幕截图,任何人都有类似问题。

Skew problem

1 个答案:

答案 0 :(得分:5)

您的问题是,内存中IplImage的一行可能比实际使用的图像宽(这是由于性能原因)。您使用glPixelStorei(GL_UNPACK_ALIGNMENT, 1);走在正确的轨道上 - 只是错误的值。

举个简单的例子,想象一个3像素宽的图像。因此,一行(RGB)基本上由9个字节(字节对齐;行之间没有间隔),10个字节(偶数字节对齐;行间1个字节空间),12个字节(字对齐;行间3个字节空间)或16个字节组成(双字对齐;行间7个字节)。

现在无法查找,但我认为默认情况下IplImage的行在字边界处对齐。由于您使用RGB(每像素3个字节;而不是4个字节),这是一个问题。只是尝试不同的值,我认为你需要单词对齐(glPixelStorei(GL_UNPACK_ALIGNMENT, 4);)。