当前位置: 首页 > news >正文

邦策网站建设平台网站建设文化咨询

邦策网站建设平台,网站建设文化咨询,简约的网站设计,中小企业网站建设与推广论文现在有这样的两张图片&#xff0c;我们怎样可以进行图片拼接&#xff0c;然后得到一张新图片下面我先讲下大致操作关键点A与找到的两个关键点 X、Y的欧氏距离分别 d1、d2&#xff0c;且d1<d2。 欧氏距离(关键点A&#xff0c;关键点X)d1。 欧氏距离(关键点A&#xff0c;关键点…

现在有这样的两张图片,我们怎样可以进行图片拼接,然后得到一张新图片

下面我先讲下大致操作

关键点A与找到的两个关键点 X、Y的欧氏距离分别 d1、d2,且d1<d2。 欧氏距离(关键点A,关键点X)=d1。 欧氏距离(关键点A,关键点Y)=d2。 (1)d1<d2,比值较大:可能不是匹配点,通常是由噪声引起的。 (2)d1<d2,比值较小:是匹配点。

还是根据上面一篇的sift特征检测来实现的,具体看代码

代码部分

import cv2
import numpy as np
import sysdef cv_show(name,img):cv2.imshow(name, img)cv2.waitKey(0)def detectAndDecribe(image):gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)sift=cv2.SIFT_create()kps, des = sift.detectAndCompute(gray, None)kps_float=np.float32([kp.pt for kp in kps])return (kps, kps_float, des)imageA=cv2.imread('img1.jpg')
imageB=cv2.imread('img2.jpg')
cv_show('imageA',imageA)
cv_show('imageB',imageB)(kpsA, kps_floatA, desA) = detectAndDecribe(imageA)
(kpsB, kps_floatB, desB) = detectAndDecribe(imageB)matcher = cv2.BFMatcher()
rawMatches = matcher.knnMatch(desB, desA, k=2)
good=[]
matches=[]
for m in rawMatches:if len(m)==2 and m[0].distance < 0.65*m[1].distance:good.append(m)matches.append((m[0].queryIdx,m[0].trainIdx))
print(len(good))
print(matches)vis=cv2.drawMatchesKnn(imageB, kpsB, imageA, kpsA, good, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv_show('vis',vis)if len(matches)>4:ptsB=np.float32([kps_floatB[i] for (i,_) in matches])ptsA=np.float32([kps_floatA[i] for (_,i) in matches])(H,mask)=cv2.findHomography(ptsB,ptsA,cv2.RANSAC,10)else:print('no matches')sys.exit()result= cv2.warpPerspective(imageB, H,(imageB.shape[1]+imageA.shape[1],imageB.shape[0]))
cv_show('result1',result)result[0:imageB.shape[0],0:imageB.shape[1]]=imageA
cv_show('result2',result)
cv2.imwrite('result.jpg',result)

代码详解3. 代码分步解析

1 图像显示辅助函数

def cv_show(name,img):cv2.imshow(name, img)cv2.waitKey(0)
  • 功能​:封装了OpenCV的图像显示逻辑
  • 参数​:窗口名称和图像矩阵
  • 说明​:waitKey(0)表示等待用户按键后关闭窗口

2 特征检测与描述函数

def detectAndDecribe(image):gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)sift = cv2.SIFT_create()kps, des = sift.detectAndCompute(gray, None)kps_float = np.float32([kp.pt for kp in kps])return (kps, kps_float, des)
  • 灰度转换​:将图像转为灰度图,减少计算量
  • SIFT特征检测​:创建SIFT检测器,检测关键点并计算描述符
  • 关键点坐标提取​:将关键点位置转换为NumPy数组格式便于后续处理
  • 返回值​:关键点对象、关键点坐标和特征描述符

3 图像加载与特征提取

imageA = cv2.imread('img1.jpg')
imageB = cv2.imread('img2.jpg')
(kpsA, kps_floatA, desA) = detectAndDecribe(imageA)
(kpsB, kps_floatB, desB) = detectAndDecribe(imageB)
  • 加载两张输入图像
  • 分别提取它们的SIFT特征

4 特征匹配与筛选

matcher = cv2.BFMatcher()
rawMatches = matcher.knnMatch(desB, desA, k=2)
good = []
matches = []
for m in rawMatches:if len(m)==2 and m[0].distance < 0.65*m[1].distance:good.append(m)matches.append((m[0].queryIdx, m[0].trainIdx))
  • BFMatcher​:使用暴力匹配器进行特征匹配
  • knnMatch​:获取每个描述符的k个最佳匹配(此处k=2)
  • Lowe's Ratio Test​:使用比例测试筛选优质匹配,保留距离比值小于0.65的匹配
  • 匹配结果​:good保存DMatch对象,matches保存匹配索引对

5 匹配可视化

vis = cv2.drawMatchesKnn(imageB, kpsB, imageA, kpsA, good, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv_show('vis', vis)
  • 可视化匹配结果,显示两图像间的特征对应关系
  • DRAW_RICH_KEYPOINTS标志会绘制带有关键点大小和方向的可视化结果

6 单应性矩阵计算

if len(matches) > 4:ptsB = np.float32([kps_floatB[i] for (i,_) in matches])ptsA = np.float32([kps_floatA[i] for (_,i) in matches])(H, mask) = cv2.findHomography(ptsB, ptsA, cv2.RANSAC, 10)
else:print('no matches')sys.exit()
  • 条件检查​:至少需要4对匹配点才能计算单应性矩阵
  • 点集提取​:从匹配结果中提取对应的点坐标
  • findHomography​:使用RANSAC算法计算单应性矩阵,鲁棒地估计图像间的变换关系
  • RANSAC参数​:10表示RANSAC重投影阈值

7 图像变换与拼接

result = cv2.warpPerspective(imageB, H, (imageB.shape[1] + imageA.shape[1], imageB.shape[0]))
cv_show('result1', result)result[0:imageB.shape[0], 0:imageB.shape[1]] = imageA
cv_show('result2', result)
cv2.imwrite('result.jpg', result)
  • warpPerspective​:对图像B应用透视变换,将其对齐到图像A的坐标系
  • 图像融合​:将图像A直接复制到变换后的图像B的左侧区域
  • 结果保存​:将拼接结果保存为JPEG文件
http://www.dtcms.com/a/506930.html

相关文章:

  • ASTM D7033-2022 定向刨花板检测
  • 使用ThreadLocal的一些注意事项
  • Kotion 常见用法注意事项(持续更新...)
  • 如何使用思维导图提升信息整理效率
  • K-VXE-TABLE二次封装,含table‘自定义列功能
  • 基于 GEE 开发的一种利用 OTSU 算法实现水体提取的便捷工具
  • Linux小课堂: 深入解析 top、htop、glances 及进程终止机制
  • 建设协会网站洛阳伟创科技
  • MongoDB 提供的 `GridFSTemplate` 操作 GridFS 大文件系统的常用查询方式
  • 2025年ASOC SCI2区TOP,基于模糊分组的多仓库多无人机电力杆巡检模因算法,深度解析+性能实测
  • 无人机地面站中不同的飞行模式具体含义释义(开源飞控常用的5种模式)
  • Inventor 转换为 3DXML 全流程技术指南:附迪威模型网在线方案
  • Maven POM 简介
  • pytorch踩坑记录
  • seo每天一贴博客南宁网站排名优化电话
  • 手机端网站开发书籍徐州vi设计公司
  • STM32F1和STM32F4在配置硬件SPI1时有什么不同?
  • 衣柜灯橱柜灯MCU方案开发
  • 数据访问对象模式(Data Access Object Pattern)
  • 滚动显示效果
  • Spring Cloud - Spring Cloud 微服务概述 (微服务的产生与特点、微服务的优缺点、微服务设计原则、微服务架构的核心组件)
  • YOLOv4:目标检测领域的 “速度与精度平衡大师”
  • agent设计模式:第二章节—路由
  • 玩转Docker | 使用Docker安装uptime-kuma监控工具
  • flutter开发小结
  • 【运维】鲲鹏麒麟V10 操作系统aarch64自制OpenSSH 9.8p1 rpm包 ssh漏洞修复
  • react学习(五) ---- hooks
  • 【C语言】程序的编译和链接(基础向)
  • 基于单片机的热量计测量系统设计
  • 显卡功能及原理介绍