【发布时间】:2020-11-01 18:23:48
【问题描述】:
我有多个世界地图的小图像(每 1 秒从无人机拍摄一次,因此新图像与之前的图像重叠)。
我正在寻找一些能够拼接图像的快速库,以便我可以显示地图。 我已经尝试过 Emgu、Accord、OpenCvSharp ......但我被卡住了,因为它们中的一些因为很小而无法正确拼接图像,其中一些速度很慢,而另一些则在每次新拼接时都会失去图像质量。
创建正射镶嵌的正确方法是什么?
目前我正在将新图像拼接到前一张(已经与前一张拼接),我认为这会更快,因为我没有一次拥有所有图像,所以我认为这是正确的方式,但正如我已经告诉过的我正在失去图像质量,如果我尝试一次拼接所有当前图像也需要很长时间。
任何建议和指点都会很棒。
这是示例数据 image data
目前使用 Accord.Net 和波纹管代码(将新的缝合到之前已经缝合的)在 4 张图像之后会出现问题
//1
HarrisCornersDetector harris = new HarrisCornersDetector(0.04f, 1000f);
harrisPoints1 = harris.ProcessImage(img1).ToArray();
harrisPoints2 = harris.ProcessImage(img2).ToArray();
//2
CorrelationMatching matcher = new CorrelationMatching(9, img1, img2);
IntPoint[][] matches = matcher.Match(harrisPoints1, harrisPoints2);
// Get the two sets of points
correlationPoints1 = matches[0];
correlationPoints2 = matches[1];
//3
RansacHomographyEstimator ransac = new RansacHomographyEstimator(0.001, 0.99);
homography = ransac.Estimate(correlationPoints1, correlationPoints2);
//4
Blend blend = new Blend(homography, img1);
Bitmap output = blend.Apply(img2);
output.MakeTransparent();
output.Save(locationName, System.Drawing.Imaging.ImageFormat.Jpeg);
output.Dispose();
【问题讨论】:
-
如果可能的话,我建议使用您的无人机的位置数据,无论是通过 GPS 还是航位推算,至少在拼接之前将您的图像分组到邻域中。重建一个区域内的图像,然后重建相邻区域。与“一次拼接所有当前图像”相比,这种方法将减少计算需求,并允许并行化。
-
@GeorgeKerwood 我知道每张图像所有 4 个角的纬度/经度。我如何使用它来加快速度?你能在缝合之前给我更多关于其他方法的信息吗?
-
这让工作变得容易多了。如果没有示例数据/图像和您之前尝试过的代码,很难为您提供答案,但是您应该在拼接之前首先按邻近度对图像子集进行分组。根据密度,您还可以知道哪些图像的哪些边缘应该缝合/叠加。使用 GPS 数据创建子集,拼接这些图像,拼接结果。这将允许您并行处理并提高性能。
-
例如,如果您有 100 张图像,则创建 10 组,每组 10 张,将它们并行拼接。然后并行拼接成对的图像以产生 5 个图像。将 5 张图像串联起来,您就完成了。优化组大小与迭代可能需要一些工作,但是如果没有看到样本,也很难给出建议。
-
什么是正确的方法...假设我每 1 秒拍摄一次新图像,将其合并/缝合到先前已缝合的图像是否明智,或者将所有图像都放在缓冲区中是否明智?然后进行合并/缝合?我明天会上传数据。
标签: c# image-processing emgucv accord.net opencvsharp