【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 = None

matches = []
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]] = ml

plt.title('after')
plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
plt.show() 

拼接结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Winform(c#)如何上传图片等资源文件

1、首先找到工程中properties&#xff0c;如下图双击其中的Resources.resx文件 2、进入下面界面&#xff0c;点击“添加资源”&#xff0c;选择要添加的图片资源 3、然后我们就可以使用了

OSPF工作过程

1.OSPF的数据包 hello包——周期性的发现&#xff0c;建立以及保活邻居关系 hello时间 --- 10S 死亡时间 --- 4倍的hello时间 --- 40S RID --- 1&#xff0c;全网唯一;2&#xff0c;格式统一---- 格式要求和IP地址一样&#xff0c;由32位二进制构成&#xff0c;使用点分十进制…

JavaEE 初阶篇-深入了解网络原理 TCP/IP 协议

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 TCP 协议概述 1.1 TCP 协议格式 2.0 TCP 协议的特性 2.1 确认应答 2.2 超时重传 2.2.1 超时的时间如何确定&#xff1f; 2.3 连接管理 2.3.1 三次握手 2.3.2 四次…

【C++】priority_queues(优先级队列)和反向迭代器适配器的实现

目录 一、 priority_queue1.priority_queue的介绍2.priority_queue的使用2.1、接口使用说明2.2、优先级队列的使用样例 3.priority_queue的底层实现3.1、库里面关于priority_queue的定义3.2、仿函数1.什么是仿函数&#xff1f;2.仿函数样例 3.3、实现优先级队列1. 1.0版本的实现…

DGC-GNN 配置运行

算法 DGC-GNN&#xff0c;这是一种全局到局部的图神经网络&#xff0c;用于提高图像中2D关键点与场景的稀疏3D点云的匹配精度。与依赖视觉描述符的方法相比&#xff0c;这种方法具有较低的内存需求&#xff0c;更好的隐私保护&#xff0c;并减少了对昂贵3D模型维护的需求。DGC-…

树莓派发送指令控制FPGA板子上的流水灯程序

文章目录 前言一、树莓派简介二、整体实现步骤三、树莓派设置四、树莓派串口代码五、Verilog代码5.1 串口接收模块5.2 流水灯模块 六、quartus引脚绑定七、 运行效果总结参考 前言 ​ 本次实验的目的是通过树莓派和FPGA之间的串口通信&#xff0c;控制FPGA开发板上的小灯。实验…

LBSS84LT1G 130MA 50V P沟道小电流MOS管

LBSS84LT1G作为一款P沟道功率MOSFET&#xff0c;由于其低导通电阻和快速切换特性&#xff0c;在电机控制中有着广泛的应用。以下是几个典型的应用案例&#xff1a; 1. 直流电机驱动&#xff1a;在直流电机驱动电路中&#xff0c;LBSS84LT1G可用于控制电机的转速和方向。通过控…

WebSocket前后端建立以及使用

1、什么是WebSocket WebSocket 是一种在 Web 应用程序中实现双向通信的协议。它提供了一种持久化的连接&#xff0c;允许服务器主动向客户端推送数据&#xff0c;同时也允许客户端向服务器发送数据&#xff0c;实现了实时的双向通信。 这部分直接说你可能听不懂&#xff1b;我…

nestJs中跨库查询

app.module.ts中配置 模块的module中 注意实体类在写的时候和数据库中的表名一样 service中使用一下

【Cesium解读】Cesium中primitive/entity贴地

官方案例 Cesium Sandcastle Cesium Sandcastle 好文推荐&#xff1a;Cesium贴地设置_primitive贴地-CSDN博客 scene.globe.depthTestAgainstTerrain true; True if primitives such as billboards, polylines, labels, etc. should be depth-tested against the terrain…

【C++】内联函数、auto、范围for

文章目录 1.内联函数2.auto关键字2.1auto简介2.2auto的注意事项2.3auto不能推导的场景 3.基于范围的for循环(C11)4.指针空值nullptr(C11) 1.内联函数 概念&#xff1a; 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函…

CLIPDraw:通过语言-图像编码器探索文本到绘图合成

摘要 本工作介绍了 CLIPDraw&#xff0c;这是一种基于自然语言输入合成新颖绘画的算法。CLIPDraw 不需要任何训练&#xff1b;相反&#xff0c;它使用了一个预先训练好的 CLIP 语言-图像编码器作为衡量标准&#xff0c;以最大化给定描述与生成绘画之间的相似度。关键的是&…

使用XxlCrawler抓取全球航空公司ICAO三字码

目录 前言 一、数据源介绍 1、目标网站 2、页面渲染结构 二、XxlCrawler信息获取 1、创建XxlCrawler对象 2、定义PageVo对象 3、直接PageVO解析 4、自定义解析 总结 前言 长距离旅行或者出差&#xff0c;飞机一定是出行的必备方式。对于旅行达人或者出差人员而言&…

为什么使用AI 在游戏中不犯法

使用AI在游戏中本身并不违法&#xff0c;甚至在很多情况下&#xff0c;游戏公司自己也会在游戏中集成AI来提高游戏体验&#xff0c;例如通过AI驱动的非玩家角色&#xff08;NPC&#xff09;来增加游戏的互动性和挑战性。然而&#xff0c;使用AI是否违法取决于AI的使用方式和目的…

轻松掌握抖音自动点赞技巧,快速吸粉

在当今这个信息爆炸的时代&#xff0c;抖音作为短视频领域的领头羊&#xff0c;不仅汇聚了庞大的用户群体&#xff0c;也成为了品牌和个人展示自我、吸引粉丝的重要平台。如何在众多内容创作者中脱颖而出&#xff0c;实现高效引流获客&#xff0c;精准推广自己的内容&#xff0…

Context Pattern上下文模式

使用情景 全局使用的配置&#xff0c;数据库的连接。MVC中的跨层数据传输携带请求ID&#xff0c;用户信息等用户权限信息线程上下文 跨层数据共享 统一调用参数 携带多个事务需要处理的对象 携带用户信息 使用ThreadLocal

项目-坦克大战-让坦克动起来

为什么写这个项目 好玩涉及到java各个方面的技术 1&#xff0c;java面向对象 2&#xff0c;多线程 3&#xff0c;文件i/o操作 4&#xff0c;数据库巩固知识 java绘图坐标体系 坐标体系-介绍 坐标体系-像素 计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的像素是一…

drippingblues 靶机实战

信息收集&#xff1a; Nmap: 存活&#xff1a; 靶机ip&#xff1a;192.168.10.110 端口&#xff1a; 服务&#xff1a; 发现ftp服务可以匿名登录。且用户名是FTP。 发现一个压缩包&#xff0c;下载并爆破。 得到密码 072528035。发现关键字 drip。里面还有一个 secret.zip(…

GIT基础01 基础命令与分支

前言 我们知道git是开发中比较常见的版本控制工具 我们可以先提出一个场景: 老板让你去修改方案 第一次修改 打回 第二次修改 打回 第n次修改 老板让你使用第一次的版本 阁下如何应对??? 我对每个版本进行编号?? 是一种方案 但是这里也是有缺陷的 比如说在很多版本中找…