Opencv项目实战:04 全景图片拼接

1,效果展示

首先,需要拍摄像这种的图片(当然,大家用我这的就可以了,我实在是太了解大家了)。

 接下来,我们来看看拼接的效果图:

 效果非常的棒,那我们再来看看,不同大小的图片的拼接效果

 除了缺失的角,其他的都还好说,本来也在我的意料之中,如果还能实现自动补齐,那我肯定会大呼一声:“厉害!!”


 2,项目准备

(1)文件夹

在pycharm项目中,请向我一样按照如图下所示创建。

 我们只需要一个放置不同图片的文件夹和一个.py文件,注意照片一定不能放乱了,在结尾处我会附上素材。

(2)熟悉一下os

当然,此项目我们只需要一个函数,学久必有忘。

	
os.listdir(path)


#返回path指定的文件夹包含的文件或文件夹的名字的列表。

 3,代码展示与讲解

import cv2
import os

mainFolder = 'Images'
myFolders = os.listdir(mainFolder)  #读取主文件
print(myFolders)

for folder in myFolders:
    path = mainFolder +'/'+folder    
    images =[]
    myList = os.listdir(path)
    print(f'Total number of images detected {len(myList)}')
    for imgN in myList:
        curImg = cv2.imread(f'{path}/{imgN}')
        curImg = cv2.resize(curImg,(0,0),None,0.2,0.2)
        images.append(curImg)

    stitcher = cv2.Stitcher.create()
    (status,result) = stitcher.stitch(images)
    if (status == cv2.STITCHER_OK):
        print('Panorama Generated')
        cv2.imshow(folder,result)
        cv2.waitKey(1)
    else:
        print('Panorama Generation Unsuccessful')

cv2.waitKey(0)

老规矩,还是看我分析讲解代码,再去看代码敲一遍。

  • 首先,我们将图片是放在了Image文件,那么它就是我们的主文件夹,使用os.listdir(path)函数,他会返回一个包含了此路径下的列表如下所示:

  •  其次,我们已经知道在Images文件夹下有两个文件,此时需要对其进行遍历,读取我们的图片,还是用os.listdir(path)函数,但此时我们的路径需要更改了,path=Images/1, Images/2,成功读取后,将图片放入列表当中,并通过打印查看是否将所有的图片读取完。

  • 除此之外,我们需要用到的是Opencv当中的Stitcher类,在这个类下有一个create函数,它的作用是简短创建在其中一种缝合模式下配置的缝合器,参数不用调配,它会提供一个默认值,它的使用方式:cv2.Stitcher.create(),接下来,我们还需要用Stitcher类下的stitch函数,它的作用是,返回状态代码和拼接结果。

  • 最后如果返回的状态码正确,即status == cv2.STITCHER_OK,当然我们将代码改成 
 if (status == 0):

       也没有任何问题,因为STITCHER_OK = 0。

4,项目总结与评价

如果你想创建一个应用程序,实现拼接功能,再了解特征检测的内部运行,将其结合在一起,这将是一个很棒思考的方向,因为我们的图片都是同一时间的场景,对比度,饱和度等是看不出变化的。

最初的效果展示中,我们可以看到在边角处还是存在着一些黑色瑕疵,那么两张尺寸不同的图,也可以进行拼接,只是有所缺角。

5,项目素材

Images/1/1.jpg

Images/1/2.jpg

 Images/1/3.jpg

 Images/2/1.jpg

  Images/2/2.jpg

 希望大家可以开心的完成本项目,如果你觉得有用,请收藏和点赞。

猜你喜欢

转载自blog.csdn.net/m0_62919535/article/details/126646837