【问题标题】:Multiple small image stitching (orthomosaic, map2d)多个小图像拼接(正射镶嵌,map2d)
【发布时间】: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


【解决方案1】:

将图像拼接在一起的基本原则非常简单,但影响最终质量的细节却无穷无尽。

Open Drone Map 值得一看。

我开发了一个纯 python (+ opencv) 图像拼接工具链来支持我的大学研究项目。它是开源的(MIT 许可)。我的作品被有意设计为一个“大胆”的系统。这是github链接:

https://github.com/UASLab/ImageAnalysis

我很乐意回答有关我工作的更多具体问题,如果我能回答更广泛的问题(在我的经验范围内),我也很乐意这样做。

(我的工具包中的屏幕截图可在上面的链接中找到......我还没有足够的声誉来发布图片。)

【讨论】:

  • 您好,欢迎来到stackoverflow!感谢您的参与。只是早期的提示,因为社区可能非常迂腐:尝试在 cmets 中保持讨论或概括。尽管有帮助,但您回答的不是“答案”。也许考虑修改以使用建议的库显示一个工作示例?虽然,OP 已经标记了这个问题 C#,所以 python 示例只能在伪意义上有所帮助。
  • 你能指出代码使用地理坐标进行拼接的特定文件吗?
  • 感谢您的反馈,我是这里文化的新手。系统允许我发布“答案”,但不允许我对原始问题发表评论,因为我还没有足够的分数。 :-( 我显然可以对自己的帖子发表评论,所以没关系。
  • 马丁:没那么简单。我的系统使用直接地理配准来获得所有特征位置的初始猜测,然后将其投入到一个大型优化器中以“完美”地将所有内容组合在一起。数学只是将一个像素投影到相机 3d 坐标中,将其转换为世界 3d 坐标(基于相机方向/位置。)然后以某种方式确定矢量与地面相交的位置(甚至是地面高程。)我有很好的运气对图像进行三角测量,以纠正主要航向误差和估计地表。
  • 另外,对不起,我所有的工作都在 python 中。我不是 C# 人。多样性是好的,而且在我们最舒适和最喜欢的环境中,我们都是最有生产力的,所以一切都很好。数学仍然是数学。逻辑仍然是逻辑。不管我们如何表达。 (呵呵,主要是)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2015-02-23
相关资源
最近更新 更多