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中字符编码简介、方法及使用建议
Jan 08 Python
初学Python函数的笔记整理
Apr 07 Python
Python的Flask框架中Flask-Admin库的简单入门指引
Apr 07 Python
Python去除字符串两端空格的方法
May 21 Python
python使用paramiko实现远程拷贝文件的方法
Apr 18 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
Aug 12 Python
Python time库基本使用方法分析
Dec 13 Python
python实现从尾到头打印单链表操作示例
Feb 22 Python
Python脚本去除文件的只读性操作
Mar 05 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
Apr 30 Python
pytorch 中autograd.grad()函数的用法说明
May 12 Python
Python 匹配文本并在其上一行追加文本
May 11 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
phpmyadmin里面导入sql语句格式的大量数据的方法
2010/06/05 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
2012/09/23 PHP
PHP设计模式之迭代器模式
2016/06/17 PHP
PHP中FTP相关函数小结
2016/07/15 PHP
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
php实现获取近几日、月时间示例
2019/07/06 PHP
用JavaScript和注册表脚本实现右键收藏Web页选中文本
2007/01/28 Javascript
JavaScript 组件之旅(四):测试 JavaScript 组件
2009/10/28 Javascript
jquery 追加tr和删除tr示例代码
2013/09/12 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
Javscript调用iframe框架页面中函数的方法
2014/11/01 Javascript
新手快速学习JavaScript免费教程资源汇总
2015/06/25 Javascript
基于js实现投票的实例代码
2015/08/04 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
2016/06/08 Javascript
JS操作xml对象转换为Json对象示例
2017/03/25 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
浅谈vue的iview列表table render函数设置DOM属性值的方法
2017/09/30 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
微信小程序前端promise封装代码实例
2019/08/24 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
[57:59]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第一场 11.05
2020/11/05 DOTA
不到40行代码用Python实现一个简单的推荐系统
2019/05/10 Python
用Python实现最速下降法求极值的方法
2019/07/10 Python
用python求一重积分和二重积分的例子
2019/12/06 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
Python操作Sqlite正确实现方法解析
2020/02/05 Python
python十进制转二进制的详解
2020/02/07 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
2020/06/27 Python
python中id函数运行方式
2020/07/03 Python
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
HTML5中的websocket实现直播功能
2018/05/21 HTML / CSS
Perfumetrader荷兰:香水、化妆品和护肤品在线商店
2017/09/15 全球购物
农业资源与环境专业自荐信范文
2013/12/30 职场文书
基层干部十八大感言
2014/01/19 职场文书
群众路线专项整治方案
2014/10/27 职场文书
幼师辞职信范文
2015/02/27 职场文书