Opencv Python實(shí)現(xiàn)兩幅圖像匹配
本文實(shí)例為大家分享了Opencv Python實(shí)現(xiàn)兩幅圖像匹配的具體代碼,供大家參考,具體內(nèi)容如下
原圖
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() #創(chuàng)建一個(gè)SURF對(duì)象 surf = cv2.xfeatures2d.SURF_create(25000) #SIFT對(duì)象會(huì)使用Hessian算法檢測(cè)關(guān)鍵點(diǎn),并且對(duì)每個(gè)關(guān)鍵點(diǎn)周圍的區(qū)域計(jì)算特征向量。該函數(shù)返回關(guān)鍵點(diǎn)的信息和描述符 keypoints1,descriptor1 = surf.detectAndCompute(image1,None) keypoints2,descriptor2 = surf.detectAndCompute(image2,None) # print('descriptor1:',descriptor1.shape(),'descriptor2',descriptor2.shape()) #在圖像上繪制關(guān)鍵點(diǎn) 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]) #提取強(qiáng)匹配特征點(diǎn) 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) #獲取排雷在前邊的幾個(gè)最優(yōu)匹配結(jié)果 goodMatchePoints = [] for i in range(len(matchePoints)): if matchePoints[i].distance < minMatch + (maxMatch-minMatch)/16: goodMatchePoints.append(matchePoints[i]) #繪制最優(yōu)匹配點(diǎn) 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) # 關(guān)鍵點(diǎn)太多,重取閾值 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算法,關(guān)鍵點(diǎn)朝向一致,運(yùn)算速度加快。 surf.upright=True kp=surf.detect(img,None) img3=cv2.drawKeypoints(img,kp,None,(255,0,0),4) plt.imshow(img3) plt.show() #檢測(cè)關(guān)鍵點(diǎn)描述符大小,改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') # 創(chuàng)造sift sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(leftImage, None) kp2, des2 = sift.detectAndCompute(rightImage, None) # 返回關(guān)鍵點(diǎn)信息和描述符 FLANN_INDEX_KDTREE = 0 indexParams = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) searchParams = dict(checks=50) # 指定索引樹要被遍歷的次數(shù) 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只畫出匹配點(diǎn),flag=0把所有的點(diǎn)都畫出 resultImage = cv2.drawMatchesKnn(leftImage, kp1, rightImage, kp2, matches, None, **drawParams) plt.imshow(resultImage) plt.show()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python使用Opencv實(shí)現(xiàn)圖像特征檢測(cè)與匹配的方法
- Python+Opencv實(shí)現(xiàn)圖像匹配功能(模板匹配)
- Python OpenCV實(shí)現(xiàn)圖像模板匹配詳解
- opencv-python圖像配準(zhǔn)(匹配和疊加)的實(shí)現(xiàn)
- Python+Opencv實(shí)現(xiàn)圖像模板匹配詳解
- python計(jì)算機(jī)視覺(jué)opencv圖像金字塔輪廓及模板匹配
- python?OpenCV實(shí)現(xiàn)圖像特征匹配示例詳解
- Python應(yīng)用案例之利用opencv實(shí)現(xiàn)圖像匹配
相關(guān)文章
Pandas實(shí)現(xiàn)groupby分組統(tǒng)計(jì)方法實(shí)例
在數(shù)據(jù)處理的過(guò)程,有可能需要對(duì)一堆數(shù)據(jù)分組處理,例如對(duì)不同的列進(jìn)行agg聚合操作(mean,min,max等等),下面這篇文章主要給大家介紹了關(guān)于Pandas實(shí)現(xiàn)groupby分組統(tǒng)計(jì)方法的相關(guān)資料,需要的朋友可以參考下2023-06-06Python實(shí)現(xiàn)的繪制三維雙螺旋線圖形功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)的繪制三維雙螺旋線圖形功能,結(jié)合實(shí)例形式分析了Python使用matplotlib、numpy模塊進(jìn)行數(shù)值運(yùn)算及圖形繪制相關(guān)操作技巧,需要的朋友可以參考下2018-06-06Django 項(xiàng)目重命名的實(shí)現(xiàn)步驟解析
這篇文章主要介紹了Django 項(xiàng)目重命名的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Python可變與不可變數(shù)據(jù)和深拷貝與淺拷貝
這篇文章主要介紹了Python可變與不可變數(shù)據(jù)和深拷貝與淺拷貝,拷貝函數(shù)是專門為可變數(shù)據(jù)類型list、set、dict使用的一種函數(shù),更多相關(guān)內(nèi)容,需要的小伙伴可以參考一下2022-04-04python 進(jìn)程間數(shù)據(jù)共享multiProcess.Manger實(shí)現(xiàn)解析
這篇文章主要介紹了python 進(jìn)程間數(shù)據(jù)共享multiProcess.Manger實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09如何使用Python做個(gè)自定義動(dòng)態(tài)壁紙
這篇文章主要介紹了如何使用Python做個(gè)自定義動(dòng)態(tài)壁紙的相關(guān)資料,需要的朋友可以參考下方法2021-08-08termux中matplotlib無(wú)法顯示中文問(wèn)題的解決方法
這篇文章主要介紹了termux中matplotlib無(wú)法顯示中文問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Pandas數(shù)據(jù)結(jié)構(gòu)詳細(xì)說(shuō)明及如何創(chuàng)建Series,DataFrame對(duì)象方法
本篇文章中,我們主要側(cè)重于介紹Pandas數(shù)據(jù)結(jié)構(gòu)本身的特性,以及如何創(chuàng)建一個(gè)Series或者DataFrame數(shù)據(jù)對(duì)象,并填入一些數(shù)據(jù)2021-10-10