import cv2 as cv import numpy as np def cv_show(name,img): cv.imshow(name,img) cv.waitKey(0) cv.destroyAllWindows() def detectAndDescribe(image): gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) sift = cv.xfeatures2d.SIFT_create() (kps,features)=sift.detectAndCompute(image,None)#这里的kps是一个特征点对象,<class 'list'>,属性有.pt关键点坐标 #.angle关键点方向 .response响应强度 .size该点的直径大小 kps = np.float32([kp.pt for kp in kps])#此刻得到kps特征点对象中每一个特征点的坐标。 return (kps,features) def matchKeypoints(kpsA,kpsB,features1,features2,ratio): bf = cv.BFMatcher() rawMatches = bf.knnMatch(features1,features2,2)#rawMatcher是一个Dmatch型对象,属性有.distance描述符间距离 #.trainIdx样本图像特征点标识符,.queryIdx测试图像的特征点标识符,.imgIdx训练图像的索引 matches = [] for m,n in rawMatches: if m.distance <n.distance *ratio: matches.append((m.trainIdx,m.queryIdx)) #在match数组中将rawMatches对象匹配得到的样本图像的特征点下标和 # 对应的测试图像的特征点下标给储存下来 if len(matches)>4: pts1 = np.float32([kpsA[i] for (_,i) in matches])#将测试图像的坐标储存到Pts1里 pts2 = np.float32([kpsB[i] for (i,_) in matches])#将样本图像的坐标储存到pts2里 # 计算视角变换矩阵H #参数一,测试图像的特征点坐标,参数二,样本图像的特征点坐标,参数三,RANSAC算法: #RANSCA原理, 因为拟合一条直线只需要两个点,因此我们每次随机选取两个点,做出直线,划定一个距离,判断落在直线周围距离范围点的个数, # 不断的迭代,直到找出拟合的直线,使得点落在上面最多的拟合曲线 #参数四:参数范围1~10,原图像的点经过变换后点与目标图像上对应点的误差,超过了就是outlier (H, status) = cv.findHomography(pts1, pts2, cv.RANSAC, 5) return (matches, H, status) return None imageA = cv.imread("E:/opencv/picture/right1.jpg") imageB = cv.imread("E:/opencv/picture/left1.png") (kpsA,features1)=detectAndDescribe(imageA) (kpsB,features2)=detectAndDescribe(imageB) M = matchKeypoints(kpsA, kpsB, features1, features2, 0.75) (matches, H, status) = M # 将图片A进行视角变换,result是变换后图片 result = cv.warpPerspective(imageA, H, (imageA.shape[1] + imageB.shape[1], imageB.shape[0])) cv_show('result1',result) result[0:imageB.shape[0], 0:imageB.shape[1]] = imageB cv_show('result2', result) 经常遇到的一个错误: new style getargs format but argument is not a tuple 针对这句代码:result = cv.warpPerspective(imageA,M,[imageA.shape[1]+imageB.shape[1],max(imageA.shape[0],imageB.shape[0])]) 原因是size那个参数应该是tuple(),而不是list[]。即应该是()而不是[]。 下面讲一下这个案例的大体过程: 1.首先我们是通过SIFT算法找到两张图(right,left)的特征点及特征向量,并把特征点的坐标储存起来。 2.通过蛮力匹配算法的得到kWmatches对象,将kWmatches对象的queryIdx和trainIdx给存起来,其中features1对应的图像为样本图像 3.求出样本图像的特征点坐标和测试图像的特征点坐标,找出这两坐标矩阵的H变换公式(利用RANSAC算法),将H变换公式对right图像做透视变换,得到拼接后的右边图像 4.将left原图赋给result对应的ROI区域,大功告成。 在这个图像处理案例中,主要涉及了使用OpenCV库在Python中进行图像拼接的过程,具体包含以下几个关键知识点: 1. **SIFT特征检测**:`SIFT`(Scale-Invariant Feature Transform,尺度不变特征变换)是一种强大的图像特征检测算法。在`detectAndDescribe()`函数中,首先将图像转换为灰度图像,然后使用`SIFT_create()`创建SIFT对象。`detectAndCompute()`方法用于在图像中检测关键点和计算它们的描述符。返回的关键点对象`kps`包含了每个关键点的位置(`.pt`)、方向(`.angle`)、响应强度(`.response`)和大小(`.size`)。 2. **特征匹配**:特征匹配是图像拼接中的重要步骤。`BFMatcher`(Brute-Force Matcher)是一个用于匹配特征点的简单算法。`knnMatch()`方法寻找最近邻匹配,返回`Dmatch`对象,包含匹配的距离(`.distance`)、样本图像特征点标识符(`.trainIdx`)和测试图像特征点标识符(`.queryIdx`)。设置参数`2`表示返回每个测试点的前两个最近邻。 3. **匹配过滤**:通过设定一个匹配比例阈值(`ratio`),过滤掉非最佳匹配。如果一个匹配点与其第二近邻的距离小于其最佳匹配距离的`ratio`倍,则认为是有效匹配。这部分通过`if m.distance < n.distance * ratio:`条件实现。 4. **RANSAC(Random Sample Consensus)**:RANSAC是一种用于估计数学模型参数的迭代算法,用于去除异常值。在这里,`findHomography()`函数利用RANSAC来估计图像间的透视变换矩阵`H`。参数包括两组匹配的特征点、RANSAC迭代次数和最大允许的点位移误差。 5. **透视变换**:利用找到的透视变换矩阵`H`,通过`warpPerspective()`函数对图像A进行透视变换,将其调整到与图像B相同的坐标系中,从而实现图像拼接。需要注意的是,`warpPerspective()`的第三个参数必须是一个包含宽度和高度的元组,而不是列表。 6. **图像拼接**:最终的图像拼接操作是将图像A经过透视变换后的结果与原图像B进行合并。通过设置子图像的ROI(Region of Interest)并赋值给结果图像的相应区域,完成拼接。 在这个案例中,由于原始代码中`warpPerspective()`函数的参数错误,使用了列表而不是元组,导致程序报错。修正这个问题后,可以正确执行图像拼接操作。整个流程从特征提取、匹配、透视变换到最后的图像融合,展示了OpenCV在图像处理中的强大功能。



















- 粉丝: 2
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 极海APM32 USB SDK-2025.7
- 物联网STM32智慧农业温室暖棚控制系统与监测系统C语言源码
- UaExpert 是一种常见的 OPC UA 客户端 用户可通过 UaExpert 连接 OPC UA 服务器并查看服务器上可用的所有节点(比如设备、传感器等)及其属性(例如温度、压力等)等信息
- ultralytics-yolo11红外人员检测-夜间监控和特殊环境人员识别+数据集+训练好的模型.zip
- 基于.NET Core+MySql+Echart.js的球场管理系统开发
- 基于Protege的知识图谱构建工具
- Python动态旅行商问题深度强化学习解决方案源码
- 基于Python+Django+MySql的毕业设计选题管理系统,含完整源代码和数据库脚本
- 战神对战平台,打开软件,即可局域网对战
- 基于JAVAFX+Mysql+JDBC+MVC实现的家庭记账系统.zip
- 基于Matlab的JONSWAP谱不规则波序列生成
- Mono.Security.dll, PublicKeyToken=0738eb9f132ed756
- 【更新至2024年】2001-2024年上市公司数字化转型年报词频统计(吴非、赵宸宇、甄红线三种方法 300+词频)
- 液晶彩电电源输出电压过低故障成因与检修方法
- DDS通讯-基于FastDDS实现发布者和订阅者应用程序案例
- Advanced IP Scanner 可靠且免费的网络扫描器


