【问题标题】:Saving 'raw' RGB bytes to image file将“原始”RGB 字节保存到图像文件
【发布时间】:2019-06-06 13:53:43
【问题描述】:

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


也许这是过早转换的情况,但为了避免复制内存,我将一些原始 RGB 数据传输到 new Mat,我并不关心它会将其解释为 BGR,因为所有操作我使用 OpenCV 执行的 m 与颜色无关。

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

我知道我可以做一个 CvInvoke.CvtColor 但这又回到了复制内存并且这让我很恼火 Mat.Save 只是将它转换回来。

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

【问题讨论】:

  • 这似乎不太可能,尽管确切的格式取决于文件扩展名并且您没有提供任何提示。不要忘记你的机器是小端的,所以如果你正在查看原始字节,那么它会向后看。

标签: c# image emgucv


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多