【问题标题】:Convert Mat to ImageSource OpenCV for Android将 Mat 转换为 Android 的 ImageSource OpenCV
【发布时间】:2019-06-22 02:51:41
【问题描述】:

使用 OpenCVSharp,将 Mat 对象转换为 System.Windows.Media.ImageSource 非常容易。

private ImageSource GetImageSource(Mat mat)
{
    return mat.ToWriteableBitmap();
}

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

如何将 Mat 转换为 Xamarin.Forms.ImageSource

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

更新

我通过将Mat 转换为Bitmap 自己解决了这个问题。

var bitmap = Bitmap.CreateBitmap(mat.Width(), mat.Height(), Bitmap.Config.Rgb565);
Utils.MatToBitmap(mat, bitmap);
var src = ImageSource.FromStream(() => getMemoryStream(bitmap));

private static MemoryStream getMemoryStream(Bitmap bitmap)
{
    try
    {
        var ms = new MemoryStream();
        bitmap.Compress(Bitmap.CompressFormat.Jpeg, 100, ms);
        ms.Seek(0L, SeekOrigin.Begin);
        return ms;
    }
    catch
    {
        // log etc
        return new MemoryStream();
    }
}

我的代码有问题吗?

【问题讨论】:

    标签: c# android opencv xamarin xamarin.forms


    【解决方案1】:

    垫到流

    public Stream MatToStream(Mat mat)
    {
        using (var vect = new MatOfByte())
        {
            if (Imgcodecs.Imencode(".png", mat, vect))
                return new MemoryStream(vect.ToArray());
            return Stream.Null;
        }
    }
    

    注意:有很多 Mat 类型(内部结构),因此取决于您的 Mat 是由什么构成的,这可能不是最有效的,并且它没有考虑输出的大小和大小需要以最少的内存消耗最有效地显示图像。

    用法:

    matImage.Source = ImageSource.FromStream(MatToStream);
    

    【讨论】:

    • 感谢您的友好回答,这对我帮助很大。我通过将Mat 转换为Android.Graphics.Bitmap 以自己的方式解决了这个问题,这不需要文件扩展名。我希望你能告诉我我的代码是否有任何问题。我将在大约 10 小时后向您展示我的代码,因为在那之前我无法访问我办公室的存储库。
    • @user4134476 啊,我完全想念你正在寻找 Android 特定的答案。
    • 我写了我的代码作为本文的更新。如果你能检查一下,我会很高兴。
    • @user4134476 我不会将其转换为 jpg,而是使用 png 以尽可能多地保留原始 Mat 的质量。除此之外,我总是转换为显示所需的大小,因此请使用目标宽度/高度与原始宽度/高度,以节省内存并获得最佳 ui 性能。
    • 非常感谢您的建议。我尝试将其转换为 png。
    猜你喜欢
    • 2019-06-19
    • 2012-10-19
    • 2023-03-18
    • 1970-01-01
    • 2018-09-04
    • 2015-12-13
    • 2017-02-19
    • 2018-11-28
    相关资源
    最近更新 更多