需要先创建一个Stitcher文件,方便拼接图片时作为库引用。

以下代码为Stitcher.py文件的内容。

import cv2
import numpy as npclass Stitcher:# 构造拼接函数def stitch(self, images, ratio=0.75, reprojThresh=4.0, showMatches=True):# 获取输入图片(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是变换后的图片# +imageB.shape[1]方便在左边放下第二张图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]] = imageBself.cv_show('result', result)# 检测是否需要匹配图片if showMatches:# 生成匹配图片vis = self.drawMatches(imageA, imageB, kpsA, kpsB, matches, status)return result, vis# 返回匹配结果return resultdef 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.SIFT_create()# 检测SIFT特征点,并计算特征描述子kps, features = descriptor.detectAndCompute(image, None)# 因为要做计算,将结果转换为numpy数组kps = np.float32([kp.pt for kp in kps])return kps, featuresdef matchKeypoints(self, kpsA, kpsB, featuresA, featuresB, ratio, reprojThresh):# 建立暴力匹配器matcher = cv2.BFMatcher()# 使用KNN检测来自A、B图的SIFT特征匹配对,K=2rawMatches = 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时,计算视角变换矩阵,投影变换要求最低有4对if len(matches) > 4:# 获取匹配对的点坐标ptsA = np.float32([kpsA[i] for (_, i) in matches])ptsB = np.float32([kpsB[i] for (i, _) in matches])# 计算视角变换矩阵# RANSAC算法算得的单应性矩阵H, status = cv2.findHomography(ptsA, ptsB, cv2.RANSAC, reprojThresh)return matches, H, status# 如果匹配对小于4时,返回Nonereturn Nonedef 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] = imageAvis[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]))# 用于在图像中画线,ptA为起点,ptB为终点cv2.line(vis, ptA, ptB, (0, 255, 0), 1)# 返回可视化结果return vis

然后编写显示拼接图片的代码。

from Stitcher import Stitcher
import cv2def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()# 读取拼接图片
imageA = cv2.imread('图像1(放在左边的图像)的名称')
imageB = cv2.imread('图像2的名称')# 把图片拼接成全景图
stitcher = Stitcher()
result, vis = stitcher.stitch([imageA, imageB], showMatches=True)# 显示所有图片
cv_show('ImageA', imageA)
cv_show('ImageB', imageB)
cv_show('Keypoints Matches', vis)
cv_show('Result', result)

opencv全景图像拼接相关推荐

  1. 基于OpenCV全景图像拼接

    本文转载基于SIFT特征的全景图像拼接http://blog.csdn.net/masibuaa/article/details/9246493 主要分为以下几个步骤: (1) 读入两张图片并分别提取 ...

  2. opencv 全景 android,基于OpenCV的Android手机全景图像拼接技术研究

    摘要: 21世纪是信息化时代,人们每天被各式各样的信息所包围,这些信息中90%来自于图像.在生活中很多情况下,人们需要记录某些场景,常用的工具就是相机,包括带拍照功能的智能手机.随着科技的发展,软硬件 ...

  3. python 全景图像拼接( python3.6 + opencv3.4.2.16) 融合

    全景图像拼接 全景图像拼接的手动实现 环境: python3.6 + opencv3.4.2.16 ## 示例图片 本次实验使用的图像拼接素材为以下三张图像: https://andreame.com ...

  4. opencv4 图像特征匹配_概述 | 全景图像拼接技术全解析

    点击上方蓝字关注我们 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 前言 图像/视频拼接的主要目的是为了解决相机视野(FOV-Field Of View)限制,生成更宽的FOV图 ...

  5. python全景图像拼接_超详讲解图像拼接/全景图原理和应用 | 附源码

    研究好玩又有用的技术第 008 期 在学习中发现快乐,在应用找到价值.这是我第八期分享图像技术应用的文章. 前七期欢迎阅读和分享: 概述 作者:Thalles Silva 编译:AI算法与图像处理 图 ...

  6. 概述 | 全景图像拼接技术全解析

    点‍击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 前言 图像/视频拼接的主要目的是为了解决相机视野(FOV-Fie ...

  7. 使用Python和OpenCV进行图像拼接和全景图构建

    使用Python和OpenCV进行图像拼接和全景图构建 1. 效果图 2. 原理及步骤 3. 源码 3.1 拼接类源码 3.2 拼接用到的工具类 3.3 叠加多张图像源码 参考 这篇博客将介绍如何使用 ...

  8. 全景图像拼接——相机参数评估

    一.项目名称:全景图像拼接 二.语言.库和开发环境:C++.opencv249.VS2013 三.参考 1:博客https://blog.csdn.net/zhaocj/article/details ...

  9. 利用OpenCV实现图像拼接的代码

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 图像拼接是利用连续帧图像生成全景图或更高分辨率的 ...

最新文章

  1. 虚拟机无法上网/连接失败原因及解决方法
  2. MySQL外键约束On Delete、On Update各取值的含义
  3. STM8不用手动复位进入自带Bootloader方法(串口下载)
  4. 51单片机学习笔记(清翔版)(21)——ADDA数模转换
  5. Java 洛谷 P1028 数的计算
  6. jsp input maxlength无效_出现这3个现象, 说明你的孩子在无效学习! 家长们: 原来如此...
  7. oracle11数据库导入,Oracle11g数据库之数据导入导出与事物
  8. notepad实现垂直标签
  9. ECharts折线图自定义横坐标显示或隐藏
  10. c语言保龄球计分系统课程设计,[C语言课程设计保龄球积分.doc
  11. 魅族开机卡flyme转圈圈
  12. 数学一年级应用题_一年级数学下册应用题大全(附带答案)
  13. Tap4fun杨祥吉:手游大佬最怕员工知道的那些事儿
  14. CYCADA: cycle-consistent adversaial domain adaption阅读笔记
  15. centos7 操作记录
  16. c语言中10的6次方阶乘运算,阶乘的运算方法
  17. 群体遗传分析—LD连锁不平衡
  18. ios百度地图更改罗盘指南针位置
  19. Fusion360学习记录:螺丝螺帽
  20. 在阿里(05)2022.04.19 周年啦

热门文章

  1. win2003的域控升级到win2008
  2. 7-2 货币转换 (10 分)
  3. 漫谈IA32的系统管理模式(SMM)以及IA32的四种CPU模式
  4. python6_12
  5. JAVA中MD5加密(MD5工具类)
  6. 使用angularJs实现tab切换
  7. 知识产权大数据平台_数据科学家的知识产权
  8. VMware GSX Server 3.2.1官方下载地址
  9. 关于C语言有没有答疑的软件,C语言答疑|有关arr的小知识
  10. this code must be changed as there‘s no longer a status bar or status bar window.