Emgu CV高分辨率图像拼接问题

时间:2018-11-09 07:05:32

标签: c# opencv emgucv

我正在使用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

图片 enter image description here enter image description here

1 个答案:

答案 0 :(得分:0)

我相当确定您遇到了内存问题,因此我继续使用来自EmguCV的最新NuGet软件包制作了一个针对.Net 4.7.2的简单控制台应用程序,该程序包版本为3.4.3.3016,并在Adobe的示例数据上使用下面的代码,可以从here下载。如果我以“ prefer 32 bit”的形式编译为“ AnyCPU”,并针对rio图像集运行此代码(出于测试目的,我加载了png的图像),然后让它运行,内存将缓慢跳升直至命中接近3 GB,然后此后不久崩溃,给出有关refcount的异常。很明显,内存问题。然后,我重新编译了针对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(); }
相关问题