【实战】OpenCV+Python项目实战--全景图拼接
文章目录
参考博客:https://blog.csdn.net/weixin_43842653/article/details/88938415
0 摘要
将两张相同场景的场景图片进行全景拼接。
1 算法实现
1.1 特征点匹配
使用的sift算法匹配,它具有旋转不变性和缩放不变性
特征点匹配过程中,并不是所有点都是最优的点,如何过滤出最优的点,为了提高结果的鲁棒性,就要去除这些错误的特征点,使用随机抽样一致算法(Random sample consensus,RANSAC),用来删除这些错误的特征点。
RANSAC算法(随机抽样一致性算法), 对于左边的图,可以看到使用最小二乘法尽可能多的满足点可以分布在拟合曲线周围,减小均分根误差,因此拟合的曲线在一定程度上容易发生偏离,而RANSAC却不会出现这种情况,
RANSCA原理, 因为拟合一条直线只需要两个点,因此我们每次随机选取两个点,做出直线,划定一个距离,判断落在直线周围距离范围点的个数,不断的迭代,直到找出拟合的直线,使得点落在上面最多的拟合曲线
每一次拟合后,容差范围内都有对应的数据点数,找出数据点个数最多的情况,就是最终的拟合结果
单应性矩阵,用H表示。
在匹配特征点的过程中,透视矩阵选取了4对特征点计算
RANSAC方法随机获取4对不同的特征匹配坐标,计算出透视矩阵H,再将第二张图的特征匹配点经过这个矩阵H映射到第一张图的坐标空间里,通过计算来验证这个H矩阵是否满足绝大部分的特征点。
通过迭代多次,以满足最多特征匹配点的特征矩阵H作为结果。这样正常情况就可以去除错误的特征点了,除非匹配错误的特征点比正确的还多。
另一种解释
图像拼接的关键是在于对图像进行变化,变化后的点与需要拼接的图片中的sift点,越接近,即欧式距离越短,对图像拼接的过程中,至少需要有4对特征点,求取变化矩阵H
我们使用RANSAC不断去取随机从两个图像中取4对的sift特征点,计算出H,定义损失值,即x’,与x的距离,即y‘与y的距离之和是否是最小值,不断迭代,找出最佳的H,上述就是计算出来了H值,也就是变化矩阵。
理解:经过变化矩阵H,相当于一个空间的点投影到另一个空间大(H矩阵最后一个值设为1,是为了做归一化好做)
1.sift.detectAndComputer(gray, None) # 计算出图像的关键点和sift特征向量
参数说明:gray表示输入的图片
2.cv2.findHomography(kpA, kpB, cv2.RANSAC, reproThresh) # 计算出单应性矩阵
参数说明:kpA表示图像A关键点的坐标, kpB图像B关键点的坐标, 使用随机抽样一致性算法来进行迭代,reproThresh表示每次抽取样本的个数
3.cv2.warpPespective(imageA, H, (imageA.shape[1] + imageB.shape[1], imageA.shape[0])) # 获得根据单应性矩阵变化后的图像
参数说明:image表示输入图像,H表示单应性的矩阵,(imageA.shape[1 7ff7 ] + imageB.shape[1], imageA.shape[0])表示矩阵变化后的维度
- cv2.line(imageA, kpsA, imageB, kpsB, (0,0,255), 2) 进行画出直线的操作
参数说明:imageA和imageB表示输入图片, kpsA和kpsB表示关键点的坐标(x, y) ,(0, 0, 255)表示颜色, 2表示直线的宽度
1.2 代码思路
第一步:对图像进行灰度化,使用sift.detectAndCompute(image, None) 进行ksp关键点,dpSIFT特征向量,将kps进行向量化操作,即kps.pt
第二步:构建BMFmatch匹配器,获得符合条件的匹配值,matches获得的是ksp关键点的匹配值得索引,使用索引获得符合条件的kspA和kspB
第三步:使用cv2.findHomography(kpA, kpB, cv2.RANSAC,reproThresh) 随机抽取4个点,求得最合适的H变化矩阵
第四步:使用获得的变化矩阵H, cv.warpPerspective 对imageA求取变化后的图像
第五步:将imageB加入到变化后的图像获得最终图像
第六步:如果需要进行展示,构造新的图像,尺寸为imageA.shape[0], imageB.shape[1] +imageA.shape[1], 使用matches的索引,使用cv2.line将符合条件的点进行连接
第七步:返回最终的结果,进行画图展示
2 代码实现
- 人脸检测和识别 源代码 下载-opencv3+python3.6完整实战项目源代码 识别视频《欢乐颂》中人物
- OpenCV 3计算机视觉:Python语言实现(原书第2版) pdf+项目源代码
- 最新Python进阶强化训练项目实战(完整)
- H2O中的随机森林算法介绍及其项目实战(python实现)
- 2 用python进行OpenCV实战之图像基本知识
- OpenCV 3计算机视觉:Python语言实现(原书第2版) pdf+项目源代码
- Python 3 视频 高级运维 Django 基础进阶高级 项目实战全新教程
- python项目实战:用多进程(multiprocessing)+多线程(threading)的方式并发爬取淘宝商品信息并存入MongoDB
- Python Opencv实战之数字识别之knn算法入门
- 【python项目实战】BBS论坛 (1)搭建项目框架
- Python网络爬虫实战项目大全!
- 4 用python进行OpenCV实战之图像变换1(平移)
- Python爬虫入门学习实战项目(二)
- Python基础阶段-项目实战之-ATM(十项)功能
- 2019最新某廖雪峰Python量化金融项目+就业爬虫人工智能项目实战课程
- 2018最新Python OpenCV视频教程计算机视觉图像识别从基础到深度学习实战
- python项目实战:hook监听电脑事件介绍
- [项目实战派]csharp通过dll调用opencv函数,图片作为参数
- Python项目实战之下载博客文章