首页 > 解决方案 > Emgu cv高分辨率图像拼接问题

问题描述

我正在使用 EmguCV 库来拼接图像。它适用于小图像,但在处理高分辨率图像或超过 20MB 大小的图像时会出现异常,或者即使我尝试处理超过 30 张图像也会失败。

我正在使用的库

Emgu.CV.UI
Emgu.CV.UI.GL
Emgu.CV.World
opencv_core2410
opencv_imgproc2410

代码

List<Image<Bgr, Byte>> sourceImages = new List<Image<Bgr,byte>>();
foreach (string path in ImgPath)
    sourceImages.Add(new Image<Bgr, Byte>(path));
using (Stitcher stitcher = new Stitcher(false))
{
    using (VectorOfMat vm = new VectorOfMat())
    {
        Mat result = new Mat();
        vm.Push(sourceImages.ToArray());
        stitcher.Stitch(vm, result);
        if (result.Bitmap != null)
        {
            result.Bitmap.Save(Application.StartupPath + "\\imgs\\StitchedImage.png");
        }
        else
        {
            MessageBox.Show("Some thing went wrong"); return null;
        }
    }
}

例外

((Emgu.CV.MatDataAllocator)(result))._dataHandle.Target' threw an exception of type 'System.InvalidOperationException

图片 在此处输入图像描述 在此处输入图像描述

标签: c#opencvemgucv

解决方案


我相当确定您遇到了内存问题,因此我继续使用NuGet的最新EmguCV包(版本 3.4.3.3016)并使用下面的代码制作了一个针对 .Net 4.7.2 的简单控制台应用程序Adobe 的示例数据,可在此处下载。如果我使用“首选 32 位”编译为“AnyCPU”并针对rio图像集(我出于测试目的加载了 png)并让它运行,内存将慢慢上升,直到接近 3 GB,然后很快崩溃,给出关于引用计数的异常。很明显是内存问题。然后我针对 64 位重新编译,并能够成功运行代码。内存使用量在 6 GB 左右达到峰值。因此,考虑到这一点,我相当肯定您的问题也与内存有关。你还没有回答你是否正在构建一个 64 位应用程序的问题,但根据你所看到的,我猜你不是。因此,解决您的问题的方法是编译为 64 位,然后确保您有足够的内存。随着rio测试集它跃升至接近 6 GB。如果没有您的图像,我无法告诉您它可能会增长多大,但是这些类型的操作非常占用内存 - 所以越多越好。这将解释大图像文件的问题和大量小图像文件的问题。我能够使用 32 位构建成功处理介于 10 到 20 个图像之间的图像集,但是当我移至 50 多个图像集时,由于内存要求,它只能使用 64 位构建。

var images = Directory.EnumerateFiles(@"C:\test\adobe\rio", "*.png", SearchOption.TopDirectoryOnly).Select(x => new Mat(x)).ToArray();
using(var stitcher = new Stitcher(false))
{
    using (var vm = new VectorOfMat(images))
    {
        var result = new Mat();
        stitcher.Stitch(vm, result);
        result.Bitmap.Save(@"C:\test\adobe\rio_stitched.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
        result.Dispose();
    }
}
foreach (var image in images) { image.Dispose(); }

推荐阅读