威望0
积分7946
贡献0
在线时间763 小时
UID1
注册时间2021-4-14
最后登录2024-11-21
管理员
- UID
- 1
- 威望
- 0
- 积分
- 7946
- 贡献
- 0
- 注册时间
- 2021-4-14
- 最后登录
- 2024-11-21
- 在线时间
- 763 小时
|
[mw_shl_code=python,true]import cv2
import numpy
#读入图像
img1=cv2.imread('C:\\Users\\liuzhaoqing\\Desktop\\1.png')
img2=cv2.imread('C:\\Users\\liuzhaoqing\\Desktop\\2.png')
#将图像转换为灰度图
gray1=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
gray2=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
# 建立SIFT生成器,以检测SIFT特征点
sift = cv2.xfeatures2d.SIFT_create()
#检测特征点,得到特征点集及对应的特征描述
kp1, des1= sift.detectAndCompute(gray1, None)
kp2, des2= sift.detectAndCompute(gray2, None)
#在图像上画出特征点
img01= numpy.copy(img1)
cv2.drawKeypoints(img1,kp1,img01)
cv2.imshow("img1_feature",img01)
img02= numpy.copy(img2)
cv2.drawKeypoints(img2,kp2,img02)
cv2.imshow("img2_feature",img02)
#建立暴力图像匹配器
matcher=cv2.DescriptorMatcher_create('BruteForce')
#使用KNN检测来自图1,图2的SIFT特征匹配对,K=2
K=2
matches=matcher.knnMatch(des1,des2,K)
#在图像上输出特征匹配(但这不是好的特征匹配)
result=cv2.drawMatchesKnn(gray2,kp2,gray1,kp1,matches,gray1,flags=2)
cv2.imshow("matches",result)
#对特征匹配结果进行筛选
goodmatches = []
good=[]
ratio=0.5
for m in matches:
# 当最近距离跟次近距离的比值小于ratio值时,保留此匹配对
if len(m) == 2 and m[0].distance < ratio * m[1].distance:
goodmatches.append((m[0].trainIdx,m[0].queryIdx))
good.append(m)
#在图像上输出特征匹配(这是好的特征匹配)
result=cv2.drawMatchesKnn(gray2,kp2,gray1,kp1,good,gray1,flags=2)
cv2.imshow("goodmatches",result)
#计算视觉变化矩阵
reprojThresh=3
#计算视角变化矩阵
#转换特征描述
kps1 = numpy.float32([kp.pt for kp in kp1])
kps2 = numpy.float32([kp.pt for kp in kp2])
if len(matches) > 4:
#获得匹配对的点坐标
p1=numpy.float32([kps1 for(_,i) in goodmatches])
p2=numpy.float32([kps2 for(i,_) in goodmatches])
(H, status) = cv2.findHomography(p1,p2,cv2.RANSAC,reprojThresh)
#图像拼接
#将图1进行视角变换,result是变化后图片
result = cv2.warpPerspective(img1, H, (img1.shape[0] + img2.shape[0], img1.shape[1]))
#将图2与result拼接
result[0:img2.shape[0], 0:img2.shape[1]] = img2
#输出拼接图像
cv2.imshow('result',result)
cv2.waitKey()
[/mw_shl_code] |
|