Сначала мы создаем пустой (или унитизированный) 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 в первую очередь (это можно сделать, отрегулировав матрицу проекции, но в этом случае следите за ориентацией треугольника). Чтобы перевернуть cv::Mat
по вертикали, вы можете использовать cv::flip
:
cv::flip(img, flipped, 0);
Итак, помните, OpenCV:
- сохраняет изображения сверху вниз, слева направо
- сохраняет цветные изображения в порядке BGR
- может не хранить строки изображения плотно упакованными