Сохранение «сырых» байтов RGB в файл изображения - PullRequest
0 голосов
/ 06 июня 2019

У меня есть странный случай, когда я хочу иметь возможность записать OpenCV.Mat на диск БЕЗ выполнения автоматического преобразования из BGR (его внутреннего представления) в RGB.


Может бытьэто случай преждевременного преобразования, но чтобы избежать копирования памяти, я помещаю некоторые необработанные данные RGB в new Mat, и мне все равно, что он интерпретирует его как BGR, потому что все операции, которые я выполняю с OpenCVне зависят от цвета.

Но когда дело доходит до сохранения на диск, значение по умолчанию Mat.Save автоматически преобразует «обратно» в RGB, поэтому мой исходный RGB заканчивается в обратном направлении.

Я знаю, что мог бы сделать CvInvoke.CvtColor но это вернулось к копированию памяти и меня раздражает, что Mat.Save просто собирается преобразовать его обратно.

Есть ли способ сказать, просто сохранить мои пиксели в пригодный для использования файлтипа, без необходимости копировать их в другое место в памяти?

1 Ответ

0 голосов
/ 07 июня 2019

ОК, я нашел довольно эзотерическое решение, которое, вероятно, не поможет многим людям. Но я также использую библиотеку Stemmer Common Vision Blox, и они имеют удобный тип WrappedImage, который может просто «оборачиваться» вокруг блока пиксельных данных и позволяет вам сказать, что внутри.

var size = mat.Cols * mat.Rows * mat.ElementSize;
WrappedImage.FromRgbPixels(mat.DataPointer, size, mat.Cols, mat.Rows, 
                           PixelDataType.UInt, 8, mat.NumberOfChannels, mat.Step, 1);

Оттуда вы можете сохранить его в любом формате без (я предполагаю) дополнительных затрат на побайтовые преобразования.

...