【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.hqwc.cn/news/700432.html

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

相关文章

产品品牌CRUD

文章目录 1.renren-generator生成CRUD1.数据库表设计1.数据表设计2.分析 2.代码生成器生成crud1.查看generator.properties&#xff08;不需要修改&#xff09;2.修改application.yml 连接的数据库修改为云数据库3.启动renren-generator模块4.浏览器访问 http://localhost:81/5…

原子学习笔记7——FrameBuffer 应用编程

Frame 是帧的意思&#xff0c;buffer 是缓冲的意思&#xff0c;所以 Framebuffer 就是帧缓冲&#xff0c;这意味着 Framebuffer 就是一块内存&#xff0c;里面保存着一帧图像。 应用程序通过对 LCD 设备节点/dev/fb0&#xff08;假设 LCD 对应的设备节点是/dev/fb0&#xff09;…

防火墙技术的演进,什么是下一代防火墙(NGFW)?

防火墙技术的演进 防火墙技术的演进经历了不同阶段&#xff0c;从包过滤防火墙到状态检测防火墙&#xff0c;再到集成多种安全功能的UTM&#xff08;统一威胁管理&#xff09;设备&#xff0c;最终发展到具备应用识别能力的NGFW&#xff08;下一代防火墙&#xff09;。 包过滤…

人工智能与机器学习的演进:重塑IT行业的未来

目录 前言一、人工智能与机器学习的最新发展1、算法和硬件的进步2、AI & ML的民主化 二、AI & ML在自动化中的应用1、工业与服务业自动化1.1 实践方式1.2 伪代码样例 2、软件开发与运维自动化2.1实践方式2.2伪代码样例 三、AI & ML在个性化服务中的应用1、推荐系统…

[数据结构1.0]快速排序

最近学习了快速排序&#xff0c;鼠鼠俺来做笔记了&#xff01; 本篇博客用排升序为例介绍快速排序&#xff01; 1.快速排序 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中的某元素作为基准值&#x…

2024年低碳发展与新能源技术国际学术会议(ICLCDNET 2024)

2024年低碳发展与新能源技术国际学术会议&#xff08;ICLCDNET 2024) 2024 International Conference on Low Carbon Development and New Energy Technologies 一、【会议简介】 随着全球气候变化的日益严峻&#xff0c;低碳发展和新能源技术已成为国际社会共同关注的焦点。在…

15-ps命令

常用选项 aux axjf a&#xff1a;显示一个终端所有的进程u&#xff1a;显示进程的归属用户及内存使用情况x&#xff1a;显示没有关联控制终端j&#xff1a;显示进程归属的进程组idf&#xff1a;以ASCII码的形式显示出进程的层次关系 ps aux其中| more是只显示一部分内容&…

国内好用的测试用例管理工具有哪些?

目前市面上的测试用例管理工具有很多&#xff0c;但由于针对的项目、领域、目标用户&#xff0c;功能也并不一致&#xff0c;所以选择一款适合的测试管理平台并不轻松。做好这件事&#xff0c;首先要需求明确你用测试管理工具干什么&#xff1f;最终想要达到什么目标&#xff1…

赋能业务全球化,明道云HAP通过亚马逊云科技 FTR认证

近日&#xff0c;明道云作为融合多元能力的超级应用平台&#xff0c;成功通过了AWS&#xff08;Amazon Web Service&#xff09;的FTR&#xff08;Foundational Technical Review&#xff09;认证。FTR是亚马逊云科技为合作伙伴解决方案提供的一项全面技术审核机制&#xff0c;…

MySQL用SQL取三列中最大的数据值

1、有如下数据&#xff1a; ABC000097.0600330.72330.720069.650027.8827.85086.92086.92219.42219.4219.41 需要展示为如下形式&#xff1a; ABC结果列0000097.06097.060330.72330.72330.7200669.65009.6527.8827.85027.8886.92086.9286.92219.42219.4219.41219.42 解决办…

在js中table表格中进行渲染轮播图

效果图&#xff1a;示例&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><script src"js/jquery-3.6.3.js"></script><style>/* 轮播图 */.basko {width: 100%;h…

关于使用git拉取gitlab仓库的步骤(解决公钥问题和pytho版本和repo版本不对应的问题)

先获取权限&#xff0c;提交ssh-key 虚拟机连接 GitLab并提交代码_gitlab提交mr-CSDN博客 配置完成上诉步骤之后&#xff0c;执行下列指令进行拉去仓库的内容 sudo apt install repo export PATHpwd/.repo/repo:$PATH python3 "实际路径"/repo init -u ssh://gitxx…