C++ OpenCV通过扭曲两个对象来缝合图像

C++ OpenCV通过扭曲两个对象来缝合图像,c++,opencv,camera-calibration,image-stitching,opencv-stitching,C++,Opencv,Camera Calibration,Image Stitching,Opencv Stitching,我已经找到了很多关于OpenCV图像拼接和扭曲的问题和答案,但我仍然找不到答案 我有两个鱼眼相机,我校准成功,使失真是消除在两个图像 现在我想把这些校正过的图像缝合在一起。所以我基本上遵循了这个例子,在很多其他缝合问题中也提到了这个例子: 所以我做了关键点和描述符检测。我找到了匹配项,也得到了单应矩阵,这样我就可以扭曲其中一幅图像,从而得到一幅真正拉伸的图像。另一个图像保持不变。拉伸是我想要避免的事情。所以我在这里找到了一个很好的解决方案: 在幻灯片7中,您可以看到两个图像都扭曲了。我认为这

我已经找到了很多关于OpenCV图像拼接和扭曲的问题和答案,但我仍然找不到答案

我有两个鱼眼相机,我校准成功,使失真是消除在两个图像

现在我想把这些校正过的图像缝合在一起。所以我基本上遵循了这个例子,在很多其他缝合问题中也提到了这个例子:

所以我做了关键点和描述符检测。我找到了匹配项,也得到了单应矩阵,这样我就可以扭曲其中一幅图像,从而得到一幅真正拉伸的图像。另一个图像保持不变。拉伸是我想要避免的事情。所以我在这里找到了一个很好的解决方案:

在幻灯片7中,您可以看到两个图像都扭曲了。我认为这将减少一个图像的拉伸(在我看来,拉伸将被分开,例如50:50)。如果我错了,请告诉我

我的问题是,我不知道如何扭曲两个图像,使它们适合。我必须计算两个同形图吗?我必须定义一个参照平面,比如Rect()或其他什么吗?如何达到幻灯片7所示的翘曲效果


说清楚一点,我不是在杜德累斯顿大学学习,所以这只是我在研究时发现的。在另一幅图像的坐标系中扭曲两幅图像中的一幅更为常见,因为这样更容易:可以直接从图像对应计算2D扭曲变换

将两个图像扭曲到新的坐标系是可能的,但更为复杂,因为它涉及三维变换,需要准确地定义与初始两个坐标系相关的新三维坐标系

基本思想(非常粗略地)在链接演示文稿幻灯片#2上的手绘图中表示。我做了一个更大的:

基本上,程序如下:

  • 如果您的相机经过校准,您可以通过计算基本矩阵、推导基本矩阵[HZ03第9.6段和等式9.12]以及推导相对姿势[HZ03第9.6.2段],仅根据特征对应来估计两幅图像之间的相对3D姿势。因此,例如,可以估计三维刚体变换T2