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编程中三条常用的技巧
May 11 Python
Python基于PycURL实现POST的方法
Jul 25 Python
Python实现公历(阳历)转农历(阴历)的方法示例
Aug 22 Python
Python爬虫框架Scrapy实例代码
Mar 04 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
Jul 17 Python
用Python PIL实现几个简单的图片特效
Jan 18 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
Jul 04 Python
Django框架基础模板标签与filter使用方法详解
Jul 23 Python
django如何通过类视图使用装饰器
Jul 24 Python
pandas DataFrame创建方法的方式
Aug 02 Python
简单了解Django项目应用创建过程
Jul 06 Python
浅谈Python 命令行参数argparse写入图片路径操作
Jul 12 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
PHP通用检测函数集合
2011/02/08 PHP
PHP版 汉字转码的实现详解
2013/06/09 PHP
PHP缓存工具XCache安装与使用方法详解
2018/04/09 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
jQuery实现友好的轮播图片特效
2015/01/12 Javascript
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
2015/09/14 Javascript
js console.log打印对像与数组用法详解
2016/01/21 Javascript
AngularJs中route的使用方法和配置
2016/02/04 Javascript
JS中的eval 为什么加括号
2016/04/13 Javascript
AngularJS实现页面定时刷新
2017/03/14 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
npm全局模块卸载及默认安装目录修改方法
2018/05/15 Javascript
package.json中homepage属性的作用详解
2020/03/11 Javascript
antd-DatePicker组件获取时间值,及相关设置方式
2020/10/27 Javascript
Python 初始化多维数组代码
2008/09/06 Python
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
Python Requests安装与简单运用
2016/04/07 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
python matplotlib imshow热图坐标替换/映射实例
2020/03/14 Python
基于Python实现简单学生管理系统
2020/07/24 Python
HTML5 Canvas实现烟花绽放特效
2016/03/02 HTML / CSS
AmazeUI 网格的实现示例
2020/08/13 HTML / CSS
运动会开幕式邀请函
2014/02/03 职场文书
职工趣味运动会方案
2014/02/10 职场文书
环境工程专业自荐信
2014/03/03 职场文书
暑期社会实践心得体会
2014/09/02 职场文书
公司委托书范本5篇
2014/09/20 职场文书
小学假期安全广播稿
2014/09/28 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
简短清晨问候语
2015/11/10 职场文书
Python实现位图分割的效果
2021/11/20 Python