【问题标题】:Convert Mat to MemoryStream OpenCV for Android将 Mat 转换为 MemoryStream OpenCV for Android
【发布时间】:2019-06-19 01:08:48
【问题描述】:

使用 OpenCVSharp,将 Mat 对象转换为 MemoryStream 非常容易。

private Stream GetStream(Mat mat, string ext)
{
    return mat.Clone().ToMemoryStream(ext);
}

如何使用 Xamarin.OpenCV.Droid 做到这一点?

https://github.com/NAXAM/opencv-android-binding/

【问题讨论】:

  • 您是要获取 png/jpg/... 文件格式的流还是只是将 Mat 克隆到流中?
  • 我想根据文件扩展名png,jpg,...等获取流。

标签: c# android opencv xamarin xamarin.android


【解决方案1】:

您使用Imgcodecs.ImencodeMat 实例和所需编码填充MatOfByte 实例,然后您可以从中获取byte[] 以填充Stream

注意:OpenCVSharp 有一系列辅助函数,在调用 ToMemoryStream 方法时执行这些函数。

示例(从文件中读取 png 并保存为 jpg):

using (var matFromPng = Imgcodecs.Imread(cachedFileName, Imgcodecs.ImreadColor))
using (var vect = new MatOfByte())
{
    if (Imgcodecs.Imencode(".jpg", matFromPng, vect))
    {
        var stream = new MemoryStream(vect.ToArray());
        // Do something with your stream...

        cachedFileName = Path.Combine(CacheDir.AbsolutePath, "her.jpg");
        using (var cacheFilestreamToJpeg = new FileStream(cachedFileName, FileMode.Create, FileAccess.Write))
        {
            stream.CopyTo(cacheFilestreamToJpeg);
        }
        stream.Dispose();
    }
}

【讨论】:

  • 非常感谢您的友好回答。这正是我一直在寻找的!
  • @user4134476 很高兴它有帮助 ?(仅供参考:确保您 Dispose 那些本机引用,否则在处理大图像时您会泄漏 OpenCV 对象并很快使 Android 崩溃。)
  • 感谢您的建议。在某些情况下,我想使用内存流(代码中的局部变量stream)作为方法的返回值,该方法将被发送到数据库进行图像分析。这种情况下可以直接返回stream吗?
  • @user4134476 返回一个 Stream 很好,只要你可以尽快处理它......
  • 非常感谢。我永远不会不处理流。
猜你喜欢
  • 2019-06-22
  • 2023-03-18
  • 2012-10-19
  • 1970-01-01
  • 2018-09-04
  • 2015-12-13
  • 2017-02-19
  • 2018-11-28
相关资源
最近更新 更多