我在图像拼接技术和算法方面相当陌生。我需要的是拼接几张图像(从 2 到 20)。图像大小约为 4-5 MB,分辨率为 4000x3000。
由于我有 .NET 背景,我尝试了安装包附带的 EmguCV 拼接示例应用程序。但我一直收到 OutOfMemory 异常或未能分配 xxxxx 字节。之后,我尝试编写使用 OpenCV 的本机 C++ 控制台应用程序并得到相同的结果。所以问题出在拼接实现内部,或者我需要为 Stitcher 类设置一些特殊设置?
尝试了不同版本的 Emgu - 2.9、2.4.2 和 2.4,OpenCV - 2.4.7
将图像大小调整到 800x600 并没有帮助。当它非常小时,库返回 0 作为结果。
我在两台不同的机器上测试了它,Windows 8 x64 8 GB RAM 和 Windows 7 x64 16 GB。在这两种情况下,应用程序都会尝试使用所有可用内存,然后崩溃。
有谁知道这个库可以处理的最大图像大小是多少?我应该使用哪些设置来减少内存使用量?有没有人能够拼接大图像?
将不胜感激任何帮助或建议。
谢谢!
EmguCV C# 代码(它实际上是来自 EmguCV 图像拼接示例应用程序的代码)
private void selectImagesButton_Click(object sender, EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.CheckFileExists = true;
dlg.Multiselect = true;
if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
sourceImageDataGridView.Rows.Clear();
Image<Bgr, Byte>[] sourceImages = new Image<Bgr, byte>[dlg.FileNames.Length];
for (int i = 0; i < sourceImages.Length; i++)
{
sourceImages[i] = new Image<Bgr, byte>(dlg.FileNames[i]);
using (Image<Bgr, byte> thumbnail = sourceImages[i].Resize(200, 200, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC, true))
{
DataGridViewRow row = sourceImageDataGridView.Rows[sourceImageDataGridView.Rows.Add()];
row.Cells["FileNameColumn"].Value = dlg.FileNames[i];
row.Cells["ThumbnailColumn"].Value = thumbnail.ToBitmap();
row.Height = 200;
}
}
try
{
using (Stitcher stitcher = new Stitcher(true))
{
Image<Bgr, Byte> result = stitcher.Stitch(sourceImages);
resultImageBox.Image = result;
}
}
finally
{
foreach (Image<Bgr, Byte> img in sourceImages)
{
img.Dispose();
}
}
}
}
OpenCV C++ 代码:
#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include <opencv2\stitching\stitcher.hpp>
using namespace cv;
using namespace std;
int main()
{
Stitcher stitcher = Stitcher::createDefault();
vector<Mat> images;
Mat img1 = imread("1.jpg");
Mat img2 = imread("2.jpg");
if(!img1.data && !img2.data)
{
cout<<"Error!\n";
return -1;
}
Mat Result;
//add images to the array
images.push_back(img1);
images.push_back(img2);
cout<<"Stitching started...\n";
Stitcher::Status status = stitcher.stitch(images, Result);
if (status != Stitcher::OK)
{
cout << "Can't stitch images, error code = " << status << endl;
}
imwrite("result.jpg",Result);
return 0;
}
更新:
在缝合器中禁用波校正后,我能够处理更大的文件并且它不会填满所有可用的 RAM。
我也想知道处理多张图像的最佳方法是什么。将它们一个接一个地缝合或将所有图像放入数组中并将所有处理责任交给 OpenCV 库?
OpenCV库中实现的拼接算法是否有任何描述?我刚找到这张图http://docs.opencv.org/modules/stitching/doc/introduction.html 我想知道和理解幕后的所有细节,因为我会处理不同分辨率和大小的不同图像。所以对我来说,在性能和质量之间取得平衡很重要。
谢谢!