在python/openCV中的图像拼接上下文中,应用束调整来全局校正图像



我正试图对安装在无人机上的相机拍摄的可能数百张航空图像进行图像配准。我认为可以放心地假设我知道图像的顺序,希望顺序图像会重叠。

我读过一些论文,这些论文建议使用CNN来寻找单应矩阵,它可以大大优于与RANSAC歌曲和舞蹈相匹配的老派特征描述符。我的问题是,我不太明白如何将两个以上的图像拼接在一起。在我看来,要使用cv2.warpPerspective函数将图像100注册在与图像1相同的坐标系中,我会执行I100H1H2*H3…H99。即使在100个应用程序之后,每个变换中的误差很小,但它似乎也会很大。我的理解是,这个问题的解决方案是捆绑调整。

我已经研究了一点捆绑调整,但我很难确定如何使用它。我读过许多相关的堆栈溢出帖子建议的论文;"使用不变特征的自动全景图像拼接";。在关于束调整的部分中,如果我理解,作者建议在构建初始全景之后,图像A很可能最终会与多个其他图像重叠。使用任何与A重叠的图像中的匹配特征点,他们基本上计算出一些调整。。。?我想想象一下A?

我的问题是使用openCV如何应用此调整?假设我有3个图像I1、I2、I3,它们都重叠,作为一个最小的例子。

#assuimg CNN model predicts transform 
#I think the first step is find the homography between all images
H12 = cnnMod.predict(I1,I2)
H13 = cnnMod.predict(I1,I3)
H23 = cnnMod.predict(I2,I3)
outI2 = cv2.warpPerspective(I2,H12,(maxWidth, maxHeight),flags=cv2.INTER_LINEAR)
outI3 = cv2.warpPerspective(I2,H23,(maxWidth, maxHeight),flags=cv2.INTER_LINEAR)
#now would I do some bundle voodoo?
#what would it look like?
#which of the bundler classes should I use?
#would it look like this?
#or maybe the input is features?
voodoo = cv2.bundleVoodoo([H12,H13,H23])
golaballyRectifiedI2 = cv2.warpPerspective(outI2,voodoo[2],(maxWidth, maxHeight),flags=cv2.INTER_LINEAR)

代码是我对解决方案的最佳猜测,但显然我不知道自己在做什么。我还没有找到任何能真正显示捆绑调整是如何完成的。

通过束调整进行图像对齐的基本思想是,不是在图像对之间匹配2D点对(x,x'(,而是假设存在3d点x,理想情况下,投影到对应图像元组之间匹配的2D点(x,x',x',…(的匹配元组上。然后,求解X的位置和相机参数(外部参数,如果相机未校准,则为内部参数(,以最小化所有2d点和图像上的RMS重投影误差(通常是稳健的(。

根据您的特定设置和场景,您可以做出一些简化的假设,例如:

  • X都属于同一平面(您可以任意选择该平面作为世界的Z=0平面(。例如,当拼接绘画图像时,或者在相对平坦、范围相对较小的地面上拼接航空图像时,这很有用,这样就可以忽略地球的曲率
  • 或者X都在WGS84椭球上。上述两个假设都从X中删除了一个自由坐标,有效地降低了问题的维数

最新更新