[英]Emgu cv high resolution images stitching Issue
我正在使用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
我相當確定您遇到了內存問題,因此我繼續使用NuGet的最新EmguCV軟件包(版本3.4.3.3016)並使用以下代碼制作了一個針對.Net 4.7.2的簡單控制台應用程序。有關Adobe樣本數據的信息,可在此處下載。 如果我使用“ 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(); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.