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之有点简约的元组
Sep 24 Python
python3.0 模拟用户登录,三次错误锁定的实例
Nov 02 Python
Python操作Sql Server 2008数据库的方法详解
May 17 Python
Python WSGI的深入理解
Aug 01 Python
Python 实现中值滤波、均值滤波的方法
Jan 09 Python
对Pycharm创建py文件时自定义头部模板的方法详解
Feb 12 Python
Python多线程及其基本使用方法实例分析
Oct 29 Python
python实现逆滤波与维纳滤波示例
Feb 26 Python
使用python3 实现插入数据到mysql
Mar 02 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
Jun 04 Python
Keras中的两种模型:Sequential和Model用法
Jun 27 Python
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
Aug 14 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
linux iconv方法的使用
2011/10/01 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
Json字符串转换为JS对象的高效方法实例
2013/05/01 Javascript
js 动态为textbox添加下拉框数据源的方法
2014/04/24 Javascript
extjs 如何给column 加上提示
2014/07/29 Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
2015/03/03 Javascript
Javascript变量的作用域和作用域链详解
2015/04/02 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
Angular.Js中ng-include指令的使用与实现
2017/05/07 Javascript
Vue.js学习教程之列表渲染详解
2017/05/17 Javascript
AngularJS全局警告框实现方法示例
2017/05/18 Javascript
js+html获取系统当前时间
2017/11/10 Javascript
vue移动端下拉刷新和上拉加载的实现代码
2018/09/08 Javascript
Echarts之悬浮框中的数据排序问题
2018/11/08 Javascript
layui的layedit富文本赋值方法
2019/09/18 Javascript
[01:42]TI4西雅图DOTA2前线报道 第一顿早饭哦
2014/07/08 DOTA
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
查看django执行的sql语句及消耗时间的两种方法
2018/05/29 Python
python爬虫之线程池和进程池功能与用法详解
2018/08/02 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
2018/12/24 Python
python手写均值滤波
2020/02/19 Python
关于Theano和Tensorflow多GPU使用问题
2020/06/19 Python
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
《一件运动衫》教学反思
2014/02/19 职场文书
班风学风建设方案
2014/05/06 职场文书
房屋租赁协议书(标准版)
2014/10/02 职场文书
纪委书记群众路线整改措施思想汇报
2014/10/09 职场文书
实习证明格式范文
2014/10/14 职场文书
股权转让协议范本
2014/12/07 职场文书
教师党员个人总结
2015/02/10 职场文书
大学运动会通讯稿
2015/07/18 职场文书
《唯一的听众》教学反思
2016/02/18 职场文书