⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计6757字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我
基于OpenCv的图像全景拼接
任务需求
图像拼接的主要目的是为了解决相机视野限制,生成更宽的图像场景。简单来说图像拼接技术就是把若干幅有重叠部分的图像合成一幅大视角宽幅面的图像。图像拼接技术已普遍出现在海洋和矿产勘测、卫星遥感探索、医学成像、计算机特效生成以及近期热门的虚拟现实等领域。
本次实验是基于特征点匹配的全景图像拼接算法,首先提取各图像中的SIFT特征,通过特征点匹配完成两幅图像的配准;再根据图像配准结果计算出图像间的变换矩阵;最后通过视角变换矩阵变换图像进行拼接。
任务目标
1、掌握基于OpenCv提取SIFT特征点
2、掌握基于OpenCv使用SIFT描述子进行Brute-Force蛮力匹配
3、掌握基于OpenCv计算单应性矩阵
任务环境
1、jupyter开发环境
2、OpenCv
3、python3.6
任务实施过程
一、图像全景拼接
图像全景拼接具体地说就是使用多个摄像机对同一个场景在不同角度拍摄,把得到的多个图像进行校正、去噪、匹配、融合,最终构建成一个质量高、清晰、边缘平滑、分辨率高的图像。
1.导入所需要的工具包和图像
import cv2 # 导入opencv
import matplotlib.pyplot as plt # 导入绘图模块
import numpy as np # 导入numpy库
from utils import im_show # 导入显示图像函数
# 绘制图像直接展示,不用调用plt.show()
%matplotlib inline
# 用来正常显示中文标签
plt.rc('font',family="SimHei")
# 读取拼接图像(右边,左边)
imgA = cv2.imread(r'./experiment/data/2.jpg')
imgB = cv2.imread(r'./experiment/data/1.jpg')
# 设置画布大小
plt.figure(figsize=(15,12))
# 显示图像
im_show('原图像',np.hstack((imgA,imgB)))
2.提取A、B图片SIFT特征描述子
# 先将两张照片转换成灰度图
grayA = cv2.cvtColor(imgA, cv2.COLOR_BGR2GRAY)
grayB = cv2.cvtColor(imgB, cv2.COLOR_BGR2GRAY)
# 建立SIFT生成器
descriptor = cv2.SIFT_create()
# 检测两个图像的SIFT特征点,并计算描述子
kpsA, featuresA = descriptor.detectAndCompute(grayA, None)
kpsB, featuresB = descriptor.detectAndCompute(grayB, None)
print('图像A和B的提取的SIFT关键点个数:',len(kpsA),len(kpsB))
# 将得到的关键点坐标转换成NumPy数组
# kpsA = np.float32([kpA.pt for kpA in kpsA])
# kpsB = np.float32([kpB.pt for kpB in kpsB])
3.Brute-Force蛮力匹配两张图片所有特征点
# 创建BFMatcher对象,使用默认参数做蛮力匹配
matcher = cv2.BFMatcher()
# 使用KNN检测来自A、B图的SIFT特征匹配对,K=2表示一个特征点对应与它最佳匹配的2个特征点
rawMatches = matcher.knnMatch(featuresA, featuresB, k=2)
# 应用比率测试
# 使用for循环,设一个特征点对应的两个特征点的距离m和n
# 如果m<0.75n(