【opencv】图像拼接实验

实验环境:anaconda、jupyter notebook

实验用到的包:opencv、matplotlib、numpy

注:opencv在3.4.2之后sift就不是免费的了

我用的是3.4.1.15版本

实验使用到的图片

book

pile

ml

mr

一、sift函数获取特征值

读入图片

book = cv2.imread('book.png', cv2.IMREAD_GRAYSCALE)
pile = cv2.imread('pile.png', cv2.IMREAD_GRAYSCALE)plt.imshow(book,'gray')
plt.show()
plt.imshow(pile,'gray')
plt.show()

书和书堆

获取特征点和特征向量

# 计算特征点和特征向量
sift = cv2.xfeatures2d.SIFT_create()kp1,des1 = sift.detectAndCompute(book, None)
kp2,des2 = sift.detectAndCompute(pile, None)

一对一匹配

# 一对一
bf = cv2.BFMatcher(crossCheck=True)matches = bf.match(des1,des2)
matches = sorted(matches, key=lambda x : x.distance)res = cv2.drawMatches(book, kp1, pile, kp2, matches[:10],None, flags=2)plt.figure(figsize=(12,8))
plt.imshow(res,'gray')
plt.show()

显示前十个匹配

一对一匹配

k对最佳匹配

# k对最佳匹配
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)# 把距离小于阈值的记录下来
good = []
for m,n in matches:if m.distance < 0.75 * n.distance:good.append([m])res = cv2.drawMatchesKnn(book, kp1, pile, kp2,good,None, flags=2)plt.figure(figsize=(12,8))
plt.imshow(res,'gray')
plt.show()

n对n匹配

二、图像拼接实验

读入图片

ml = cv2.imread('ml.png')
ml_gray = cv2.cvtColor(ml, cv2.COLOR_BGR2GRAY)
mr = cv2.imread('mr.png')
mr_gray = cv2.cvtColor(mr, cv2.COLOR_BGR2GRAY)plt.imshow(ml_gray, 'gray')
plt.show()plt.imshow(mr_gray, 'gray')
plt.show()

待拼接图片

获取特征点和特征向量

# 获取特征点和特征向量
sift = cv2.xfeatures2d.SIFT_create()
kpl,desl = sift.detectAndCompute(ml_gray, None)
kpl_f = np.float32([kp.pt for kp in kpl])
kpr,desr = sift.detectAndCompute(mr_gray, None)
kpr_f = np.float32([kp.pt for kp in kpr])# 匹配并显示
bf = cv2.BFMatcher(crossCheck=True)matches = bf.match(desl,desr)
matches = sorted(matches, key=lambda x : x.distance)res = cv2.drawMatches(ml_gray, kpl, mr_gray, kpr, matches[:100],None, flags=2)plt.figure(figsize=(12,8))
plt.imshow(res,'gray')
plt.show()

匹配特征点

拼接图片

拼接图片实质上就是把一张图片的一部分变化到匹配另一张图片后,把另一张图片覆盖到变化的部分上

matcher = cv2.BFMatcher()raw_matches = matcher.knnMatch(desr, desl, 2)H = Nonematches = []
for m in raw_matches:# 保留合适的特征值if len(m) == 2 and m[0].distance < m[1].distance * 0.75 :matches.append([m[0].trainIdx, m[0].queryIdx])# 配对大于4时,计算时间变换矩阵
if len(matches) > 4:# 获取配对的点坐标ptsl = np.float32([kpl_f[i] for (i,_) in matches])ptsr = np.float32([kpr_f[i] for (_,i) in matches])# 计算视角变换矩阵(H, status) = cv2.findHomography(ptsr, ptsl, cv2.RANSAC, 4)#对右图进行变换
result = cv2.warpPerspective(mr,H,(mr.shape[1] + ml.shape[1],mr.shape[0]))plt.title('before')
plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
plt.show() # 左图覆盖
result[0:ml.shape[0], 0:ml.shape[1]] = mlplt.title('after')
plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
plt.show() 

拼接结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/12353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【极简】如何估算大模型inference所需的内存量

1字节8bit 16float2字节 模型后面的xxb的单位是字节。 1b 字节≈ 0.93G&#xff0c;这个是以8bit运行&#xff0c;4bit减半&#xff0c;16bit&#xff08;float&#xff09;加倍&#xff0c;32bit&#xff08;double&#xff09;炒鸡加倍。 剩下的是小头&#xff0c;需要参数计…

苹果macOS无法给App麦克风授权解决办法

好久没有在电脑上录制课程了&#xff0c;有些东西还是录下来记忆深刻&#xff0c;却意外发现MAC系统升级后无法授权给第三方的App使用摄像头和麦克风&#xff0c;而录屏软件是需要开启麦克风和摄像头才能录制屏幕上的操作和声音&#xff0c;官方提示在第三方APP若有使用摄像头和…

css的4种导入方式

熟悉CSS样式4种的引用方式&#xff0c;分别为行内式、内嵌式、链入式和导入式。 行内式 <标签名 style"属性1:属性值1;属性2:属性值2;属性3:属性值3;">内容</ 标签名>style是标签的属性&#xff0c;实际上任何HTML标签都拥有style属性&#xff0c;用来…

pyqt QComboBox下拉列表框控件

pyqt QComboBox下拉列表框控件 QComboBox效果代码 QComboBox QComboBox 是 PyQt&#xff08;中的一个控件&#xff0c;它允许用户从下拉列表中选择一个选项。这个控件在需要用户从预定义选项中进行选择时非常有用。 效果 代码 import sys from PyQt5.QtWidgets import QAppl…

vite创建的项目使用rem适配

下面以创建vue3.0 项目为例&#xff1a; npm init vitelatest “名称” 选择vue &#xff08;选择你所对应的语言&#xff09; 更具提示步骤执行 cd xxx npm i npm run dev 然后再项目中使用 rem 需要安装插件 第一步安装插件 npm i amfe-flexible npm i postcss-pxtorem 第二…

CS144 Checkpoint 4: interoperating in the world(2024)

分析网络路径和性能&#xff1a; mtr命令 mtr 输出的详细分析&#xff1a; mtr 162.105.253.58 命令用于结合 traceroute 和 ping 的功能&#xff0c;实时监测并分析从你的计算机到目标主机&#xff08;IP 地址 162.105.253.58&#xff0c;北京大学计算中心&#xff09;之间…

Nginx配置Referer防盗链

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 HTTP Referer是Hea…

PBOOTCMS|URL静态制作教程(已解答)

0、先解压源码文件&#xff0c;在覆盖静态文件&#xff0c;全部点是。 打开程序后台登录地址www.xxx.com(你的域名)/admin.php/Menu/index 打开程序后台--系统菜单--菜单新增&#xff08;清理缓存后重新登录账号&#xff09; &#xff08;选择父菜单&#xff0c;菜单名称&#…

ROS2+TurtleBot3+Cartographer+Nav2实现slam建图和导航

0 引言 入门机器人最常见的应用就是slam建图和导航&#xff0c;本文将详细介绍这一流程&#xff0c; 便于初学这快速上手。 首先对需要用到的软件包就行简单介绍。 turtlebot3: 是一个小型的&#xff0c;基于ros的移动机器人。 学习机器人的很多示例程序都是基于turtlebot3。 …

【Java基础】枚举类的方法及应用

如何实现让一个类有固定个数的对象 手动封装构造方法&#xff08;private&#xff09; → 创建静态对象 → final修饰静态对象&#xff0c;使其成为常量 class Season { //枚举类public final static Season SPRING new Season();public final static Season SUMMER new Se…

MySQL数据库备份全攻略:从基础到高级,一文掌握所有备份技巧

在数据为王的时代&#xff0c;数据库的备份无疑是每一位数据库管理员&#xff08;DBA&#xff09;和开发者必须掌握的核心技能。MySQL作为世界上最流行的开源关系型数据库管理系统&#xff0c;其备份策略的多样性和灵活性更是值得我们深入探讨。今天&#xff0c;我们将从基础的…

废品回收微信小程序基于FastAdmin+ThinkPHP+UniApp(源码搭建/上线/运营/售后/更新)

一款基于FastAdminThinkPHPUniApp开发的废品回收系统&#xff0c;适用废品回收站、再生资源回收公司上门回收使用的小程序。 一、FastAdmin框架特色功能及优势 模块化开发&#xff1a;控制器、模型、视图、JS一一对应&#xff0c;使用RequireJS进行插件机制&#xff0c;支持插…

Java面试题:线程池的核心参数和工作原理

线程池的核心参数 ThreadPoolExecutor(int corePoolSize,//核心线程数目int MaximumPoolSize,//最大线程数核心线程临时线程long keepAliveTime,//临时线程的存活时间,在存活时间内如果没有新任务,线程资源会被释放TimeUnit unit,//存活时间的时间单位,一个枚举类型BlockingQu…

sql操作、发送http请求和邮件发送 全栈开发之路——后端篇(2)

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

STL介绍及使用场景分析

一.总体介绍 STL&#xff08;Standard Template Library&#xff09;是C标准模板库&#xff0c;提供了一系列的通用模板类和函数&#xff0c;用于实现常见的数据结构和算法&#xff0c;方便开发者快速地实现各种功能。STL包括了容器&#xff08;Containers&#xff09;、算法&a…

[BJDCTF 2020]easy_md5、[HNCTF 2022 Week1]Interesting_include、[GDOUCTF 2023]泄露的伪装

目录 [BJDCTF 2020]easy_md5 ffifdyop [SWPUCTF 2021 新生赛]crypto8 [HNCTF 2022 Week1]Interesting_include php://filter协议 [GDOUCTF 2023]泄露的伪装 [BJDCTF 2020]easy_md5 尝试输入一个1&#xff0c;发现输入的内容会通过get传递但是没有其他回显 观察一下响应…

文本协议中嵌入二进制数据

在文本协议中嵌入二进制数据时&#xff0c;通常不推荐使用new String(byte[], Charset)&#xff0c;除非你确定这些字节实际上是以指定的字符集编码的文本。这是因为如果字节不是有效的文本编码&#xff0c;那么使用new String(byte[], Charset)可能会产生不可预测的结果&#…

VictoriaMetrics

概念 介绍 VictoriaMetrics&#xff0c;是一个快速高效、经济并且可扩展的监控解决方案和时序数据库 本文均用VM简称VictoriaMetric 作用 用于作为prometheus的长期储存方案&#xff0c;代替prometheus存储监控采集的数据 优点 远程存储&#xff1a;可作为单一或多个Pro…

【算法】二分查找——二分查找

本节博客详述“二分查找”并且以例子来进行讨论&#xff0c;有需要借鉴即可。 目录 1.二分查找1.1使用前提1.2模板 2.题目3.题解代码示例4.二分查找的一般模板5.总结 1.二分查找 1.1使用前提 使用的条件&#xff1a;数组具有“二段性”&#xff0c;二段性指的是数组可以根据某…

110份财务常用excel模板(个税、采购、报销、预算),超实用!

如果你还在为报表头疼&#xff0c;那你一定不能错过这篇干货满满的分享&#xff01; 个税报表 个人所得税&#xff0c;听起来就头大&#xff1f;别担心&#xff0c;掌握这些技巧&#xff0c;轻松搞定&#xff01; - 记录员工收入&#xff0c;确保数据准确无误 - 计算应纳税…