OpenCV全景图像拼接的实现示例


Posted in Python onJune 05, 2021

本文主要介绍了OpenCV全景图像拼接的实现示例,分享给大家,具体如下:

left_01.jpg

OpenCV全景图像拼接的实现示例

right_01.jpg

OpenCV全景图像拼接的实现示例

Stitcher.py

import numpy as np
import cv2
 
class Stitcher:
 
    #拼接函数
    def stitch(self, images, ratio=0.75, reprojThresh=4.0,showMatches=False):
        #获取输入图片
        (imageB, imageA) = images
        #检测A、B图片的SIFT关键特征点,并计算特征描述子
        (kpsA, featuresA) = self.detectAndDescribe(imageA)
        (kpsB, featuresB) = self.detectAndDescribe(imageB)
 
        # 匹配两张图片的所有特征点,返回匹配结果
        M = self.matchKeypoints(kpsA, kpsB, featuresA, featuresB, ratio, reprojThresh)
 
        # 如果返回结果为空,没有匹配成功的特征点,退出算法
        if M is None:
            return None
 
        # 否则,提取匹配结果
        # H是3x3视角变换矩阵      
        (matches, H, status) = M
        # 将图片A进行视角变换,result是变换后图片
        result = cv2.warpPerspective(imageA, H, (imageA.shape[1] + imageB.shape[1], imageA.shape[0]))
        self.cv_show('result', result)
        # 将图片B传入result图片最左端
        result[0:imageB.shape[0], 0:imageB.shape[1]] = imageB
        self.cv_show('result', result)
        # 检测是否需要显示图片匹配
        if showMatches:
            # 生成匹配图片
            vis = self.drawMatches(imageA, imageB, kpsA, kpsB, matches, status)
            # 返回结果
            return (result, vis)
 
        # 返回匹配结果
        return result
    def cv_show(self,name,img):
        cv2.imshow(name, img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
 
    def detectAndDescribe(self, image):
        # 将彩色图片转换成灰度图
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
 
        # 建立SIFT生成器
        descriptor = cv2.xfeatures2d.SIFT_create()
        # 检测SIFT特征点,并计算描述子
        (kps, features) = descriptor.detectAndCompute(image, None)
 
        # 将结果转换成NumPy数组
        kps = np.float32([kp.pt for kp in kps])
 
        # 返回特征点集,及对应的描述特征
        return (kps, features)
 
    def matchKeypoints(self, kpsA, kpsB, featuresA, featuresB, ratio, reprojThresh):
        # 建立暴力匹配器
        matcher = cv2.BFMatcher()
  
        # 使用KNN检测来自A、B图的SIFT特征匹配对,K=2
        rawMatches = matcher.knnMatch(featuresA, featuresB, 2)
 
        matches = []
        for m in rawMatches:
            # 当最近距离跟次近距离的比值小于ratio值时,保留此匹配对
            if len(m) == 2 and m[0].distance < m[1].distance * ratio:
            # 存储两个点在featuresA, featuresB中的索引值
                matches.append((m[0].trainIdx, m[0].queryIdx))
 
        # 当筛选后的匹配对大于4时,计算视角变换矩阵
        if len(matches) > 4:
            # 获取匹配对的点坐标
            ptsA = np.float32([kpsA[i] for (_, i) in matches])
            ptsB = np.float32([kpsB[i] for (i, _) in matches])
 
            # 计算视角变换矩阵
            (H, status) = cv2.findHomography(ptsA, ptsB, cv2.RANSAC, reprojThresh)
 
            # 返回结果
            return (matches, H, status)
 
        # 如果匹配对小于4时,返回None
        return None
 
    def drawMatches(self, imageA, imageB, kpsA, kpsB, matches, status):
        # 初始化可视化图片,将A、B图左右连接到一起
        (hA, wA) = imageA.shape[:2]
        (hB, wB) = imageB.shape[:2]
        vis = np.zeros((max(hA, hB), wA + wB, 3), dtype="uint8")
        vis[0:hA, 0:wA] = imageA
        vis[0:hB, wA:] = imageB
 
        # 联合遍历,画出匹配对
        for ((trainIdx, queryIdx), s) in zip(matches, status):
            # 当点对匹配成功时,画到可视化图上
            if s == 1:
                # 画出匹配对
                ptA = (int(kpsA[queryIdx][0]), int(kpsA[queryIdx][1]))
                ptB = (int(kpsB[trainIdx][0]) + wA, int(kpsB[trainIdx][1]))
                cv2.line(vis, ptA, ptB, (0, 255, 0), 1)
 
        # 返回可视化结果
        return vis

ImageStiching.py

from Stitcher import Stitcher
import cv2
 
# 读取拼接图片
imageA = cv2.imread("left_01.jpg")
imageB = cv2.imread("right_01.jpg")
 
# 把图片拼接成全景图
stitcher = Stitcher()
(result, vis) = stitcher.stitch([imageA, imageB], showMatches=True)
 
# 显示所有图片
cv2.imshow("Image A", imageA)
cv2.imshow("Image B", imageB)
cv2.imshow("Keypoint Matches", vis)
cv2.imshow("Result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

OpenCV全景图像拼接的实现示例

OpenCV全景图像拼接的实现示例

如遇以下错误:

cv2.error: OpenCV(3.4.3) C:\projects\opencv-python\opencv_contrib\modules\xfeatures2d\src\sift.cpp:1207: error: (-213:The function/feature is not implemented) This algorithm is patented and is excluded in this configuration; Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function ‘cv::xfeatures2d::SIFT::create'

如果运行OpenCV程序提示算法版权问题可以通过安装低版本的opencv-contrib-python解决:

pip install --user opencv-contrib-python==3.3.0.10

到此这篇关于OpenCV全景图像拼接的实现示例的文章就介绍到这了,更多相关OpenCV 图像拼接内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python 2与Python 3版本和编码的对比
Feb 14 Python
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
Mar 11 Python
Django安装配置mysql的方法步骤
Oct 15 Python
详解python中sort排序使用
Mar 23 Python
Python选择网卡发包及接收数据包
Apr 04 Python
Python opencv实现人眼/人脸识别以及实时打码处理
Apr 29 Python
python实现字符串完美拆分split()的方法
Jul 16 Python
让你的Python代码实现类型提示功能
Nov 19 Python
pyinstaller打包程序exe踩过的坑
Nov 19 Python
wxpython自定义下拉列表框过程图解
Feb 14 Python
Python如何脚本过滤文件中的注释
May 27 Python
Python项目打包成二进制的方法
Dec 30 Python
opencv 分类白天与夜景视频的方法
python如何利用traceback获取详细的异常信息
Jun 05 #Python
Python异常类型以及处理方法汇总
Jun 05 #Python
Python OpenCV 彩色与灰度图像的转换实现
Python深度学习之实现卷积神经网络
python opencv通过4坐标剪裁图片
Jun 05 #Python
Python还能这么玩之只用30行代码从excel提取个人值班表
Jun 05 #Python
You might like
fgetcvs在linux的问题
2012/01/15 PHP
中高级PHP程序员应该掌握哪些技术?
2016/09/23 PHP
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
在PHP中输出JS语句以及乱码问题的解决方案
2019/02/13 PHP
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
javascript各种复制代码收集
2008/09/20 Javascript
jQuery前端框架easyui使用Dialog时bug处理
2014/12/05 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
js实现仿QQ秀换装效果的方法
2015/03/04 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
jqPlot jQuery绘图插件的使用
2016/06/18 Javascript
js闭包用法实例详解
2016/12/13 Javascript
js仿百度音乐全选操作
2017/01/13 Javascript
html5+canvas实现支持触屏的签名插件教程
2017/05/08 Javascript
AngularJS 打开新的标签页实现代码
2017/09/07 Javascript
VUE 使用中踩过的坑
2018/02/08 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
koa2的中间件功能及应用示例
2020/03/05 Javascript
5个你不知道的JavaScript字符串处理库(小结)
2020/06/01 Javascript
原生js 实现表单验证功能
2021/02/08 Javascript
[49:35]LGD vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
Python获取当前路径实现代码
2017/05/08 Python
使用paramiko远程执行命令、下发文件的实例
2017/10/01 Python
Mac中Python 3环境下安装scrapy的方法教程
2017/10/26 Python
理解python中生成器用法
2017/12/20 Python
Python使用matplotlib绘制Logistic曲线操作示例
2019/11/28 Python
Python warning警告出现的原因及忽略方法
2020/01/31 Python
美国最大的网上冲印店:Shutterfly
2017/01/01 全球购物
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
食品安全检查制度
2014/02/03 职场文书
产品生产计划书
2014/05/07 职场文书
施工安全承诺书
2014/05/22 职场文书
毕业欢送会致辞
2015/07/29 职场文书
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
2021/04/14 Python
前端canvas中物体边框和控制点的实现示例
2022/08/05 Javascript