c++ - OpenCV 通过扭曲两者来拼接图像

标签 c++ opencv camera-calibration image-stitching opencv-stitching

我已经找到了很多关于使用 OpenCV 进行图像拼接和变形的问题和答案,但我仍然找不到我的问题的答案。

我有两个鱼眼相机,我已成功校准,因此两张图像中的失真均已消除。

现在我想将这些校正后的图像拼接在一起。所以我几乎遵循这个例子,在很多其他拼接问题中也提到了这个例子: Image Stitching Example

所以我做了关键点和描述符检测。我找到了匹配项,还得到了 Homography 矩阵,这样我就可以扭曲其中一个图像,从而得到一个真正拉伸(stretch)的图像。另一个图像保持不变。拉伸(stretch)是我想避免的。所以我在这里找到了一个不错的解决方案: Stretch solution .

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

我的问题是我不知道如何扭曲两个图像以使其适合。我必须计算两个同位词吗?我是否必须定义像 Rect() 之类的引用平面?如何实现如幻灯片 7 所示的变形结果?

为了明确,我不在德累斯顿工业大学学习,所以这只是我在研究时发现的。

最佳答案

在另一张的坐标系中扭曲两幅图像中的一张更为常见,因为它更容易:可以直接从图像对应关系中计算二维扭曲变换。

将两个图像扭曲到一个新的坐标系是可能的,但更复杂,因为它涉及 3D 变换并且需要相对于最初的两个准确地定义一个新的 3D 坐标系。

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

enter image description here

基本上,程序如下:

  1. 如果您的相机经过校准,您可以通过计算基本矩阵、推导基本矩阵 [HZ03 第 9.6 段和方程 9.12] 并推导出相对位姿 [HZ03第 9.6.2 段]。因此,您可以估计例如将 img1 的坐标系映射到 img2 的坐标系的 3D 刚性变换 T2<-1:

T2<-1 = R2<-1 * [ I3 | 0]

  1. 由此,您可以非常准确地定义新图像相对于其他两个图像的图像平面。例如:

Tn<-1 = square_root(R2<-1) * [ I3 | 0]

Tn<-2 = Tn<-1 * T2<-1-1

  1. 从这两个相对姿势中,您可以导出像素 2D 变换,以在新图像平面中扭曲两个图像 [HZ03,示例 13.2]。基本上,从 img1 到新图像和从 img2 到新图像的翘曲单应性分别是:

Hn<-1 = K * Rn<-1 * K-1

Hn<-2 = K * Rn<-2 * K-1

  1. 然后您还可以计算新图像平面中有效像素的范围(即 xmin、xmax、ymin、ymax),以对其进行裁剪并形成新图像。

请注意,第 3 步假设图像是从空间中的同一点拍摄的(纯相机旋转),否则图像之间可能会存在一些视差,从而产生可见的拼接缺陷。

希望这会有所帮助。

引用:[HZ03] Hartley、Richard 和 Andrew Zisserman。计算机视觉中的多 View 几何。剑桥大学出版社,2003 年。

关于c++ - OpenCV 通过扭曲两者来拼接图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31409607/

相关文章:

C++ sleep(0) 循环行为

opencv - 使用 opencv 最小化方程

c++ - Pthreads 在互斥锁中间死亡

c++ - 在 C/C++ 程序中使用 Mono SGen 垃圾收集器

c++ - sql::mysql::get_driver_instance() 找不到符号

image - 使用opencv识别png格式图像的质量

python - 如何使用分段仿射变换拉直弯曲的文本线/轮廓?

c# - 视频流中的多个QRCode检测

opencv - 在RealSense库中将红外图像映射为彩色图像

python - cv2 triangulatePoints 总是返回相同的 Z 值