Изображение OpenCV в OpenGL: странное поведение - PullRequest
1 голос
/ 14 марта 2012

Я использую следующий код для создания и отображения текстуры из 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 Ответ

5 голосов
/ 14 марта 2012

Ваша проблема заключается в том, что одна строка вашей IplImage в памяти может быть шире, чем фактическое используемое изображение (это связано с соображениями производительности). Вы на правильном пути, используя glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - просто с неправильным значением.

В качестве простого примера представьте изображение шириной 3 пикселя. Таким образом, одна строка (RGB) по существу состоит из 9 байтов (выравнивание байтов; между строками нет промежутка), 10 байтов (выравнивание даже байтов; интервал между байтами 1 байт), 12 байтов (выравнивание слов; интервал между байтами 3 байта) или 16 байтов (выравнивание по двойному слову; интервал между строками 7 байт).

Не могу найти его прямо сейчас, но я думаю, что строки IplImage выровнены по границам слов по умолчанию. Из-за того, что вы используете RGB (с 3 байтами на пиксель; не с 4 байтами), это проблема. Просто попробуйте разные значения, я думаю, вам понадобится выравнивание слов (glPixelStorei(GL_UNPACK_ALIGNMENT, 4);).

...