已知相机参数时的OpenCV图像拼接
Posted
技术标签:
【中文标题】已知相机参数时的OpenCV图像拼接【英文标题】:OpenCV Image stiching when camera parameters are known 【发布时间】:2014-02-08 13:44:21 【问题描述】:我们有从一架飞机飞过一个有 50% 重叠区域的飞机拍摄的照片,并且正在使用 OpenCV 拼接算法将它们拼接在一起。这适用于我们的版本 1。在我们的下一次迭代中,我们想要研究一些我可以使用一些 cmets 的额外内容。
目前拼接算法估计相机参数。我们确实有相机参数和大量关于相机角度、位置 (GPS) 等的可用平面信息。与让算法根据匹配的特征点估计所有内容相比,我们能否从这些信息中受益?
这些图像是以高分辨率拍摄的,此时算法会占用相当多的 RAM,这不是什么大问题,因为我们只是在云中启动大型机器。但我想在我们的下一次迭代中从下采样图像中提取单应性并将其应用于稍后的大图像。这也将为我们提供更多选项来操作和可视化原始图像上的其他信息,并能够在原始图像和拼接图像之间来回切换。
如果我们在问题 1 中要拆开拼接算法以放入已知信息,是只是使用 findHomography
方法来获取信息还是在我们实际知道单应性时有更好的替代方法来创建单应性平面位置和角度以及相机参数。
我对opencv有基本的了解,并且对c++编程很好,所以编写我们自己的自定义拼接器不是问题,但是这里的理论有点生疏。
【问题讨论】:
您以什么分辨率捕获图像?如果它们足够高,那么您可以对它们进行下采样,但我建议您尽可能避免它(我不是下采样的忠实粉丝)。您可以使用特征点或校准的相机进行拼接(我不确定组合是否是可行的解决方案);不过,您可以使用相机参数来加快单应性功能。 5000x7400 像素 (50mb) 原始文件。此时,我想知道花时间了解有关将相机参数用于任何事物或匹配功能的知识是否有意义,只要它有效。但感谢您的评论。但是对图像进行下采样应该没有什么问题。下采样还可以从我假设的图像中去除一些噪点。 您的 GPS 信息是否足够准确,可以对图像进行微调? 我还没有尝试过,但考虑一下它很可能不会,答案也表明人们也会使用图像功能。 【参考方案1】:由于您使用单应性来扭曲图像,因此我假设您捕获的区域足够小,您不必担心地球曲率效应。另外,我假设您不使用高程模型。
一般来说,您总是希望使用匹配的图像点来收紧(单应性)模型,因为您的最终输出是拼接图像。如果您有 RAM 和 CPU 预算,您可以使用最大似然估计器来优化您的线性模型。
具有先前的运动模型(例如来自 GPS + IMU)可用于初始化特征搜索和匹配。通过对特征表观运动的足够好的初始估计,您可以省去昂贵的特征描述符计算和存储,而只需使用归一化互相关。
【讨论】:
谢谢,这些 cmets 很好。我现在的结论也是,我可以使用先验信息来简化搜索功能的区域并以这种方式加快搜索过程。很高兴知道我总是想用匹配的图像点来加强单应性。此时,我们通常将 5-15 个图像拼接在一起以覆盖局部区域。但我也很感兴趣,如果我们要将事物拼接到一个包含地球曲率并在大面积上呈现大地图的错误图像中,在哪里寻找信息。【参考方案2】:如果我理解正确,图像是垂直拍摄的,并且由已知数量的像素重叠,在这种情况下计算单应性有点过分:你只是在谈论一个平移矩阵,而使用更强大的算法只能给出你这不好的条件矩阵。
在二维中,如果 H 是表示透视变换的广义单应矩阵,
H=[[a1 a2 a3] [a4 a5 a6] [a7 a8 a9]]
如果 a9==1,则子矩阵 R 和 T 分别代表旋转和平移。
R= [[a1 a2] [a4 a5]], T=[[a3] [a6]]
而[a7 a8]
代表每个轴的拉伸。 (所有这些都是 bit 近似值,因为当所有效果都存在时,它们会相互影响。
因此,如果您知道横向位移,您可以创建一个只有 a3
、a6
和 a9=1
的 3x3 矩阵,并将其传递给 cv::warpPerspective
或 cv::warpAffine
。
作为匹配正确性的标准,您可以计算像素之间的归一化差异。
【讨论】:
谢谢。这就说得通了。我认为 Francesco 的观点是,使用图像点来加强单应性总是一个好主意。 确实如此,但要小心使用 RANSAC 和四点组的单应性估计,因为它可能会给出条件差的矩阵。一种可能性是使用特征对应的单应性计算,提取矩阵 T 并验证 R 和拉伸子矩阵不会变坏。 只是为了确认,您是说要验证 RANSAC 发现的单应性应该根据我们从 gps 和航班数据中获得的已知信息进行验证? 是的。 RANSAC 算法对噪声具有鲁棒性,但多少取决于可能的迭代次数,即有多少机会选择四个对应关系,计算它们的 H 矩阵并用所有其他点对应关系验证这个 H(基本上,四个 @987654329 @嵌套循环:S)。此外,输出精度“地板”取决于输入图像的“清晰度”(例如大气、传感器/相机的点扩散函数)。以上是关于已知相机参数时的OpenCV图像拼接的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV 例程 300篇255.OpenCV 实现图像拼接