У меня есть матрица с 3 каналами, и у меня есть проблема с доступом и изменением значения элементов. У меня есть этот код:opencv matrix multi channel access and fill
Mat m(4,4, CV_8UC3);
Vec3b a;
a[0] = 255;
a[1] = 0;
a[2] = 0;
m.at<Vec3b>(0,0) = a;
при печати матрицы м, у меня есть это:
[255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
это хорошо, но образ, который я получаю, когда я хранить матрицу с imwrite
это один :
, и я не понимаю, почему это синее и почему у меня есть квадрат 2х2 синих, я должен был только первым пикселем красного нет?
Я где-то ошибся?
Это не Quirk OpenCV, но Windows quirk. Если вы пишете свой 3-канальный буфер изображения на диск, как есть (в виде bmp или ppm), и откройте его в каком-нибудь средстве просмотра изображений, вы увидите, что он рассматривается как изображение BGR, а не изображение RGB.Для OpenCV, чтобы изображение в формате RGB означало замену пикселов изображения для каждого imread и imwrite. Во многих случаях это просто трата времени. –
Итак, это причуда BMP и PPM, которая стала причудой Opencv :) Вы случайно знаете, что пиксели заменяются при сохранении/чтении JPG или PNG? –
BMP и PPM - это всего лишь примеры форматов, в которых хранится буфер изображений, без сжатия. Если вы выделили 1 мегабайт памяти для своего изображения и сохранили его на жестком диске, на вашем жестком диске потребуется 1 мегабайт. Это не относится к PNG или JPEG. Эти изображения будут меньше, что означает, что они были сжаты (сжатие без потерь для PNG и сжатие с потерями для JPG). Таким образом, вопрос об обмене не имеет смысла, поскольку эти форматы не сохраняют значения пикселей, а данные, из которых эти значения могут быть восстановлены. –