Ответ 1
Сначала мы создаем пустую (или унифицированную) cv::Mat
для чтения наших данных непосредственно. Это можно сделать один раз при запуске, но, с другой стороны, cv::Mat::create
не очень дорого стоит, когда изображение уже имеет соответствующий размер и тип. Тип зависит от ваших потребностей, обычно это что-то вроде CV_8UC3
для 24-битного цветного изображения.
cv::Mat img(height, width, CV_8UC3);
или
img.create(height, width, CV_8UC3);
Тогда вам нужно учитывать cv::Mat
, не обязательно сохраняя строки изображений смежно. В конце каждой строки может быть небольшое значение заполнения, чтобы выровнять строки по 4 байта (или 8?). Поэтому вам нужно возиться с режимами хранения пикселей:
//use fast 4-byte alignment (default anyway) if possible
glPixelStorei(GL_PACK_ALIGNMENT, (img.step & 3) ? 1 : 4);
//set length of one complete row in destination data (doesn't need to equal img.cols)
glPixelStorei(GL_PACK_ROW_LENGTH, img.step/img.elemSize());
Далее тип матрицы влияет на параметры формата и типа glReadPixels
. Если вам нужны цветные изображения, вы должны иметь в виду, что OpenCV обычно сохраняет значения цвета в порядке BGR, поэтому вам нужно использовать GL_BGR(A)
(которые были добавлены с OpenGL 1.2) вместо GL_RGB(A)
. Для изображений одного компонента используйте либо GL_LUMINANCE
(который суммирует отдельные цветовые компоненты), либо GL_RED
, GL_GREEN
,... (для получения отдельного компонента). Итак, для нашего изображения CV_8UC3
окончательный вызов, чтобы прочитать его непосредственно в cv::Mat
, будет следующим:
glReadPixels(0, 0, img.cols, img.rows, GL_BGR, GL_UNSIGNED_BYTE, img.data);
Наконец, OpenCV сохраняет изображения сверху вниз. Таким образом, вам может потребоваться либо перевернуть их после их получения, либо сделать их первыми в OpenGL (это можно сделать, отрегулировав матрицу проекции, но в этом случае следите за ориентацией треугольника). Чтобы перевернуть a cv::Mat
по вертикали, вы можете использовать cv::flip
:
cv::flip(img, flipped, 0);
Поэтому, чтобы иметь в виду OpenCV:
- хранит изображения сверху донизу, слева направо
- хранит цветные изображения в порядке BGR
- может не хранить строки изображений плотно упакованные