📜  OpenCV 全景拼接

📅  最后修改于: 2022-05-13 01:54:36.872000             🧑  作者: Mango

OpenCV 全景拼接

本文介绍如何使用 OpenCV 和Python“拼接”图像。

全景图基本上是水平拉伸而不会失真的照片。

我们将在今天的讨论中将 3 张图像拼接在一起,以创建我们自己的全景图。为了实现这一点,图像之间必须有一些共同的关键点。换句话说,连续图像中的一小部分必须重叠,否则图像无法拼接在一起。准备好相关图像后,我们可以简单地使用属于 OpenCV 模块中的 Stitcher 类的 Stitch()函数。它将一组图像作为参数并将它们拼接在一起。该函数返回结果图像和一个布尔值,如果 拼接成功,否则返回False。



根据您的需要调整输入图像的大小。如果图像太大,那么缩小它们总是更好的选择。

OpenCV 的拼接算法类似于 Lowe 和 Brown 关于使用不变特征的自动全景图像拼接的论文。但是这里是opencv的拼接类的流程图算法。

解释:

全景拼接算法可以分为四个基本步骤。这些步骤如下:

  1. 检测关键点(图像上的点)并从输入图像中提取局部不变描述符(SIFT 特征)。
  2. 在输入图像之间寻找匹配的描述符。
  3. 使用 RANSAC 算法计算单应矩阵。
  4. 然后将单应矩阵应用于图像以包装和拟合这些图像并将它们合并为一个。

描述符是描述特定关键点周围的局部环境的向量。

通过计算图像在不同级别的高斯模糊的差异来找到关键点。这意味着图像被不同幅度的高斯模糊模糊,从轻微模糊到更模糊等等。然后将这些图像相互减去,导致具有不同高斯模糊级别的图像的差异。生成的图像相互堆叠以寻找局部不同的极值点,即关键点。

通过查看关键点的邻域,将局部邻域分解成小区域,然后计算这些小区域中的梯度来计算描述符。这些梯度以直方图的形式收集。基本上,这些梯度发生的频率和它们的大小被转换成小局部区域的直方图。最后,连接从直方图计算的所有值将产生描述符向量。这作为一个整体被称为 SIFT 特征,它只不过是一种计算关键点和描述符的方法。

来到单应矩阵,它将一个图像的对应点映射到另一个。这对于创建全景图至关重要。有必要计算两个图像的单应性,因为它有助于将一个图像包裹到另一个图像上,这对于创建全景图很有用。 RANSAC 算法有助于计算这个单应矩阵。

实际拼接由拼接器类的 .stitch()函数或方法完成。它实现了上述步骤。此函数随最新版本的 OpenCV 一起提供。 Stitch()函数接受图像列表作为参数。它返回一个元组(状态,输出),其中状态是一个布尔值,当拼接成功时它为真,否则为假。输出是由此产生的全景图。

执行:

Python3
import cv2
image_paths=['1.jpg','2.jpg','3.jpg']
# initialized a list of images
imgs = []
  
for i in range(len(image_paths)):
    imgs.append(cv2.imread(image_paths[i]))
    imgs[i]=cv2.resize(imgs[i],(0,0),fx=0.4,fy=0.4)
    # this is optional if your input images isn't too large
    # you don't need to scale down the image
    # in my case the input images are of dimensions 3000x1200
    # and due to this the resultant image won't fit the screen
    # scaling down the images 
# showing the original pictures
cv2.imshow('1',imgs[0])
cv2.imshow('2',imgs[1])
cv2.imshow('3',imgs[2])
  
stitchy=cv2.Stitcher.create()
(dummy,output)=stitchy.stitch(imgs)
  
if dummy != cv2.STITCHER_OK:
  # checking if the stitching procedure is sucessful
  # .stitch() function returns a true value if stitching is 
  # done successfully
    print("stitching ain't successful")
else: 
    print('Your Panorama is ready!!!')
  
# final output
cv2.imshow('final result',output)
  
cv2.waitKey(0)


输出: