【深度学习】OpenCV 图像拼接——SIFT特征匹配与透视变换实战
OpenCV 图像拼接——SIFT特征匹配与透视变换实战一、图像拼接概述1. 案例效果预览2. 什么是图像拼接3. 图像拼接完整流程二、案例实现1. 定义特征检测函数2. 定义图像显示函数3. 提取图像特征点4. 特征点匹配暴力匹配 K近邻BFMatcher 暴力匹配器K近邻匹配参数说明返回值说明5. 绘制匹配结果6. 计算透视变换矩阵7. 透视变换与图像拼接8. 完整代码汇总一、图像拼接概述1. 案例效果预览左图为待拼接图像1右图为待拼接图像2经过图像拼接处理后得到全景拼接结果2. 什么是图像拼接图像拼接Image Stitching是指将多张具有重叠区域的图像合成为一张大图的技术。该技术在计算机视觉和图像处理领域应用广泛主要包括全景图像创建如手机全景模式大幅面照片合成无人机航拍图像拼接医学影像拼接3. 图像拼接完整流程图像拼接通常包含以下七个步骤步骤1加载图像—— 使用cv2.imread()加载待拼接的图像步骤2特征点检测与描述—— 使用 SIFT、ORB 等算法提取图像中的特征点及其描述符步骤3特征点匹配—— 使用 KNN 匹配等算法找到两幅图像间的对应关系步骤4图像配准—— 使用 RANSAC 等算法估计两幅图像间的变换矩阵仿射变换或透视变换步骤5图像变换与拼接—— 利用估计的变换矩阵对图像进行变换并拼接步骤6图像调整—— 对拼接结果进行融合平滑处理消除拼接缝二、案例实现1. 定义特征检测函数importcv2importnumpyasnpimportsysdefdetectAndDescribe(image): 检测图像中的SIFT关键点并计算描述符 参数 image: 输入图像BGR格式 返回 kps: 关键点对象列表 kps_float: 关键点坐标数组浮点数 des: 关键点描述符矩阵 graycv2.cvtColor(image,cv2.COLOR_BGR2GRAY)descriptorcv2.SIFT_create()(kps,des)descriptor.detectAndCompute(gray,None)# 将关键点坐标转换为浮点数数组kps_floatnp.float32([kp.ptforkpinkps])return(kps,kps_float,des)2. 定义图像显示函数defcv_show(name,img):显示图像的辅助函数cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()3. 提取图像特征点# 读取待拼接的两张图像imageAcv2.imread(1.jpg)cv_show(imageA,imageA)imageBcv2.imread(2.jpg)cv_show(imageB,imageB)# 计算两张图像的特征点及描述符(kpsA,kps_floatA,desA)detectAndDescribe(imageA)(kpsB,kps_floatB,desB)detectAndDescribe(imageB)调试模式下查看返回数据kps关键点对象列表包含坐标、尺度、方向等信息des描述符矩阵每行对应一个关键点的 128 维特征向量4. 特征点匹配暴力匹配 K近邻BFMatcher 暴力匹配器在图像处理中特征点匹配是指在不同图像中找到对应的特征点。BFMatcherBrute-Force Matcher通过计算两个特征向量集合中所有特征点之间的距离如欧氏距离、汉明距离等选择距离最近的作为匹配点。K近邻匹配# 创建暴力匹配器matchercv2.BFMatcher()# 使用 KNN 匹配K2对 desB 中的每个描述符在 desA 中查找两个最近邻rawMatchesmatcher.knnMatch(desB,desA,2)good[]# 存放匹配成功的特征点对matches[]# 存放匹配成功的两个点的索引forminrawMatches:# 当最近距离与次近距离的比值小于 0.65 时保留此匹配对iflen(m)2andm[0].distance0.65*m[1].distance:good.append(m)matches.append((m[0].trainIdx,m[0].queryIdx))print(f匹配成功的特征点个数:{len(good)})print(f匹配点索引:{matches})参数说明参数说明queryDescriptors匹配图像A的描述符trainDescriptors匹配图像B的描述符K最佳匹配的描述符个数一般取 K2mask可选掩码用于过滤不需要匹配的特征点返回值说明distance匹配特征点描述符的欧氏距离数值越小表示特征越相近queryIdx测试图像特征点描述符的下标trainIdx样本图像特征点描述符的下标5. 绘制匹配结果# 绘制两组关键点的匹配结果viscv2.drawMatchesKnn(imageB,kpsB,imageA,kpsA,good,None,flagscv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)cv_show(keypoint matches,vis)6. 计算透视变换矩阵# 透视变换要求至少 4 个匹配点iflen(matches)4:# 分别获取匹配成功的 A 图和 B 图中点的坐标ptsAnp.float32([kps_floatA[i]for(i,_)inmatches])ptsBnp.float32([kps_floatB[i]for(_,i)inmatches])# 使用 RANSAC 算法估计透视变换矩阵(H,mask)cv2.findHomography(ptsB,ptsA,cv2.RANSAC,10)else:print(未找到 4 个以上的匹配点)sys.exit()7. 透视变换与图像拼接# 根据透视变换矩阵 H 将图像 B 进行变换# 输出图像宽度为两张图像宽度之和高度取图像 B 的高度resultcv2.warpPerspective(imageB,H,(imageB.shape[1]imageA.shape[1],imageB.shape[0]))cv_show(resultB,result)# 将图像 A 填充到结果图像的左侧result[0:imageA.shape[0],0:imageA.shape[1]]imageA cv_show(result,result)8. 完整代码汇总importcv2importnumpyasnpimportsysdefcv_show(name,img):cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()defdetectAndDescribe(image):graycv2.cvtColor(image,cv2.COLOR_BGR2GRAY)descriptorcv2.SIFT_create()(kps,des)descriptor.detectAndCompute(gray,None)kps_floatnp.float32([kp.ptforkpinkps])return(kps,kps_float,des)# 读取图像imageAcv2.imread(1.jpg)cv_show(imageA,imageA)imageBcv2.imread(2.jpg)cv_show(imageB,imageB)# 提取特征(kpsA,kps_floatA,desA)detectAndDescribe(imageA)(kpsB,kps_floatB,desB)detectAndDescribe(imageB)# 特征匹配matchercv2.BFMatcher()rawMatchesmatcher.knnMatch(desB,desA,2)good[]matches[]forminrawMatches:iflen(m)2andm[0].distance0.65*m[1].distance:good.append(m)matches.append((m[0].trainIdx,m[0].queryIdx))print(f匹配成功的特征点个数:{len(good)})# 绘制匹配结果viscv2.drawMatchesKnn(imageB,kpsB,imageA,kpsA,good,None,flagscv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)cv_show(keypoint matches,vis)# 计算透视变换矩阵iflen(matches)4:ptsAnp.float32([kps_floatA[i]for(i,_)inmatches])ptsBnp.float32([kps_floatB[i]for(_,i)inmatches])(H,mask)cv2.findHomography(ptsB,ptsA,cv2.RANSAC,10)else:print(未找到 4 个以上的匹配点)sys.exit()# 透视变换与拼接resultcv2.warpPerspective(imageB,H,(imageB.shape[1]imageA.shape[1],imageB.shape[0]))result[0:imageA.shape[0],0:imageA.shape[1]]imageA cv_show(result,result)

相关新闻

【深度学习】OpenCV 角点检测与 SIFT 特征提取详解

【深度学习】OpenCV 角点检测与 SIFT 特征提取详解

OpenCV 角点检测与 SIFT 特征提取详解一、角点检测1. 什么是角点检测2. 检测流程3. 邻域(Neighborhood)4. Harris 角点检测案例关键函数说明完整代码二、SIFT 特征提取1. 什么是 SIFT2. 特征提取的一般步骤3. SIFT 案例实现完整代码代码解析关键点信息一…

2026/7/28 0:53:00 阅读更多 →
技术栈全解析!打造企业 RAG 知识库,这些核心技术缺一不可

技术栈全解析!打造企业 RAG 知识库,这些核心技术缺一不可

当团队文档越来越多,查找越来越慢;当客服每天重复回答同样的问题;当新人入职培训找不到资料……你是否想过:如果有一个智能助手,能秒懂所有公司知识,该多好? 这就是知识库的价值。今天&#xff…

2026/7/28 0:53:00 阅读更多 →
端到端,构建企业级知识库!!我把它做成项目给你

端到端,构建企业级知识库!!我把它做成项目给你

❝ 沉淀、分享、成长,让自己和他人都能有所收获!😜 ❞从前车马慢,一个需求聊一天。现在端到端,今天提,明天上线! 怀念,带着零食、拎着饮料,拉着研发,一聊就是…

2026/7/28 0:53:00 阅读更多 →

最新新闻

GBase 8s SSC共享存储集群四大核心能力介绍

GBase 8s SSC共享存储集群四大核心能力介绍

从技术层面的四大核心突破,到金融、民政等关键领域的长期实战沉淀,南大通用GBase 8s SSC共享存储集群(gbase database)用真实落地成果,印证了国产共享存储数据库的硬核实力,打破了核心领域对海外数据库的依…

2026/7/28 0:58:01 阅读更多 →
GBase 8s SSC共享存储集群以硬核实力入选2026产业图谱

GBase 8s SSC共享存储集群以硬核实力入选2026产业图谱

2026可信数据库大会重磅发布新版中国数据库产业图谱,首次新增共享存储架构数据库独立赛道,南大通用GBase 8s SSC共享存储集群(gbase database)成功入选,获得行业权威背书。作为适配政企核心业务的国产数据库架构方案&a…

2026/7/28 0:58:01 阅读更多 →
高管邮件秒回率提升81%的秘密:基于NLP情感熵值分析的AI润色模型

高管邮件秒回率提升81%的秘密:基于NLP情感熵值分析的AI润色模型

更多请点击: https://kaifayun.com 第一章:高管邮件秒回率提升81%的秘密:基于NLP情感熵值分析的AI润色模型 在企业通信场景中,高管收件箱日均处理邮件超127封,但平均响应延迟达4.3小时。传统“礼貌性润色”仅优化措辞…

2026/7/28 0:58:01 阅读更多 →
Dify性能瓶颈诊断:CPU飙升87%?内存泄漏定位→压测报告→优化前后QPS对比(附可复用监控脚本)

Dify性能瓶颈诊断:CPU飙升87%?内存泄漏定位→压测报告→优化前后QPS对比(附可复用监控脚本)

更多请点击: https://codechina.net 第一章:Dify性能瓶颈诊断:CPU飙升87%?内存泄漏定位→压测报告→优化前后QPS对比(附可复用监控脚本) CPU与内存异常捕获实战 当Dify服务在生产环境突发CPU使用率飙升至…

2026/7/28 0:58:01 阅读更多 →
如何快速掌握NomNom存档编辑器:No Man‘s Sky新手完全指南

如何快速掌握NomNom存档编辑器:No Man‘s Sky新手完全指南

如何快速掌握NomNom存档编辑器:No Mans Sky新手完全指南 【免费下载链接】NomNom NomNom is the most complete savegame editor for NMS but also shows additional information around the data youre about to change. You can also easily look up each item in…

2026/7/28 0:58:01 阅读更多 →
别再让AI乱改Flutter代码!我总结了一套边界管控方案

别再让AI乱改Flutter代码!我总结了一套边界管控方案

文章目录一、现在AI写Flutter代码跟脱缰野马一样1.1 代码跑偏四大经典社死现场二、全套约束方案,专治AI乱改代码2.1 双层规则文件,给模型画死红线2.1.1 AGENTS.md:项目通用底线,不超50行2.1.2 .cursor/rules/拆分规则文件&#xf…

2026/7/28 0:57:01 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻