本文实例为大家分享了Opencv Python实现两幅图像匹配的具体代码,供大家参考,具体内容如下
原图
import cv2 img1 = cv2.imread('SURF_2.jpg', cv2.IMREAD_GRAYSCALE) img1 = cv2.resize(img1,dsize=(600,400)) img2 = cv2.imread('SURF_1.jpg', cv2.IMREAD_GRAYSCALE) img2 = cv2.resize(img2,dsize=(600,400)) image1 = img1.copy() image2 = img2.copy() #创建一个SURF对象 surf = cv2.xfeatures2d.SURF_create(25000) #SIFT对象会使用Hessian算法检测关键点,并且对每个关键点周围的区域计算特征向量。该函数返回关键点的信息和描述符 keypoints1,descriptor1 = surf.detectAndCompute(image1,None) keypoints2,descriptor2 = surf.detectAndCompute(image2,None) # print('descriptor1:',descriptor1.shape(),'descriptor2',descriptor2.shape()) #在图像上绘制关键点 image1 = cv2.drawKeypoints(image=image1,keypoints = keypoints1,outImage=image1,color=(255,0,255),flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) image2 = cv2.drawKeypoints(image=image2,keypoints = keypoints2,outImage=image2,color=(255,0,255),flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) #显示图像 cv2.imshow('surf_keypoints1',image1) cv2.imshow('surf_keypoints2',image2) cv2.waitKey(20) matcher = cv2.FlannBasedMatcher() matchePoints = matcher.match(descriptor1,descriptor2) # print(type(matchePoints),len(matchePoints),matchePoints[0]) #提取强匹配特征点 minMatch = 1 maxMatch = 0 for i in range(len(matchePoints)): if minMatch > matchePoints[i].distance: minMatch = matchePoints[i].distance if maxMatch < matchePoints[i].distance: maxMatch = matchePoints[i].distance print('最佳匹配值是:',minMatch) print('最差匹配值是:',maxMatch) #获取排雷在前边的几个最优匹配结果 goodMatchePoints = [] for i in range(len(matchePoints)): if matchePoints[i].distance < minMatch + (maxMatch-minMatch)/16: goodMatchePoints.append(matchePoints[i]) #绘制最优匹配点 outImg = None outImg = cv2.drawMatches(img1,keypoints1,img2,keypoints2,goodMatchePoints,outImg, matchColor=(0,255,0),flags=cv2.DRAW_MATCHES_FLAGS_DEFAULT) cv2.imshow('matche',outImg) cv2.waitKey(0) cv2.destroyAllWindows()
原图
#coding=utf-8 import cv2 from matplotlib import pyplot as plt img=cv2.imread('xfeatures2d.SURF_create2.jpg',0) # surf=cv2.SURF(400) #Hessian阈值400 # kp,des=surf.detectAndCompute(img,None) # leng=len(kp) # print(leng) # 关键点太多,重取阈值 surf=cv2.cv2.xfeatures2d.SURF_create(50000) #Hessian阈值50000 kp,des=surf.detectAndCompute(img,None) leng=len(kp) print(leng) img2=cv2.drawKeypoints(img,kp,None,(255,0,0),4) plt.imshow(img2) plt.show() # 下面是U-SURF算法,关键点朝向一致,运算速度加快。 surf.upright=True kp=surf.detect(img,None) img3=cv2.drawKeypoints(img,kp,None,(255,0,0),4) plt.imshow(img3) plt.show() #检测关键点描述符大小,改64维成128维 surf.extended=True kp,des=surf.detectAndCompute(img,None) dem1=surf.descriptorSize() print(dem1) shp1=des.shape() print(shp1)
效果图
import cv2 from matplotlib import pyplot as plt leftImage = cv2.imread('xfeatures2d.SURF_create_1.jpg') rightImage = cv2.imread('xfeatures2d.SURF_create_2.jpg') # 创造sift sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(leftImage, None) kp2, des2 = sift.detectAndCompute(rightImage, None) # 返回关键点信息和描述符 FLANN_INDEX_KDTREE = 0 indexParams = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) searchParams = dict(checks=50) # 指定索引树要被遍历的次数 flann = cv2.FlannBasedMatcher(indexParams, searchParams) matches = flann.knnMatch(des1, des2, k=2) matchesMask = [[0, 0] for i in range(len(matches))] print("matches", matches[0]) for i, (m, n) in enumerate(matches): if m.distance < 0.07 * n.distance: matchesMask[i] = [1, 0] drawParams = dict(matchColor=(0, 255, 0), singlePointColor=None, matchesMask=matchesMask, flags=2) # flag=2只画出匹配点,flag=0把所有的点都画出 resultImage = cv2.drawMatchesKnn(leftImage, kp1, rightImage, kp2, matches, None, **drawParams) plt.imshow(resultImage) plt.show()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。
- 本文固定链接: https://zxbcw.cn/post/215620/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)