将“原始” RGB字节保存到图像文件

时间:2019-06-06 13:53:43

标签: c# image emgucv

我有一个奇怪的情况,我希望能够将OpenCV.Mat写入磁盘而不进行从BGR(内部表示)到RGB的自动转换。


也许是过早转换的情况,但是为了避免复制内存,我将一些原始RGB数据写入new Mat中,并且我并不在乎将其解释为BGR,因为所有操作我用OpenCV进行的颜色不可知。

但是在保存到磁盘时,默认的Mat.Save会自动将'back'转换为RGB,所以我原来的RGB最终会倒退。

我知道我可以做一个CvInvoke.CvtColor,但这又回到了复制内存 上,这让我感到Mat.Save只是将其转换回来。

是否有办法说只需将像素保存为可用的文件类型,而不必将其复制到内存中的另一个位置?

1 个答案:

答案 0 :(得分:0)

好的,我找到了一个相当深奥的解决方案,这可能对很多人没有帮助。但是我碰巧也使用了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);

您可以从那里将其保存为任何格式,而无需(我认为)额外的逐字节转换开销。