python opencv3 基於ORB的特征檢測和 BF暴力匹配 knn匹配 flann匹配


git:https://github.com/linyi0604/Computer-Vision

bf暴力匹配:

 1 # coding:utf-8
 2 
 3 import cv2  4 
 5 """
 6 orb特征檢測和匹配  7  兩幅圖片分別是 樂隊的logo 和包含該logo的專輯封面  8  利用orb進行檢測后進行匹配兩幅圖片中的logo  9     
10 """
11 # 按照灰度圖像的方式讀入兩幅圖片
12 img1 = cv2.imread("../data/logo1.png", cv2.IMREAD_GRAYSCALE) 13 img2 = cv2.imread("../data/album1.png", cv2.IMREAD_GRAYSCALE) 14 
15 # 創建ORB特征檢測器和描述符
16 orb = cv2.ORB_create() 17 # 對兩幅圖像檢測特征和描述符
18 keypoint1, descriptor1 = orb.detectAndCompute(img1, None) 19 keypoint2, descriptor2 = orb.detectAndCompute(img2, None) 20 """
21 keypoint 是一個包含若干點的列表 22 descriptor 對應每個點的描述符 是一個列表, 每一項都是檢測到的特征的局部圖像 23 
24 檢測的結果是關鍵點 25 計算的結果是描述符 26 
27 可以根據監測點的描述符 來比較檢測點的相似之處 28 
29 """
30 # 獲得一個暴力匹配器的對象
31 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) 32 # 利用匹配器 匹配兩個描述符的相近成都
33 maches = bf.match(descriptor1, descriptor2) 34 # 按照相近程度 進行排序
35 maches = sorted(maches, key=lambda x: x.distance) 36 # 畫出匹配項
37 img3 = cv2.drawMatches(img1, keypoint1, img2, keypoint2, maches[: 30], img2, flags=2) 38 
39 cv2.imshow("matches", img3) 40 cv2.waitKey() 41 cv2.destroyAllWindows()

 

knn匹配:

 1 # coding:utf-8
 2 
 3 import cv2  4 
 5 # 按照灰度圖像讀入兩張圖片
 6 img1 = cv2.imread("../data/logo1.png", cv2.IMREAD_GRAYSCALE)  7 img2 = cv2.imread("../data/album1.png", cv2.IMREAD_GRAYSCALE)  8 
 9 # 獲取特征提取器對象
10 orb = cv2.ORB_create() 11 # 檢測關鍵點和特征描述
12 keypoint1, desc1 = orb.detectAndCompute(img1, None) 13 keypoint2, desc2 = orb.detectAndCompute(img2, None) 14 """
15 keypoint 是關鍵點的列表 16 desc 檢測到的特征的局部圖的列表 17 """
18 # 獲得knn檢測器
19 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) 20 matches = bf.knnMatch(desc1, desc2, k=1) 21 """
22 knn 匹配可以返回k個最佳的匹配項 23 bf返回所有的匹配項 24 """
25 # 畫出匹配結果
26 img3 = cv2.drawMatchesKnn(img1, keypoint1, img2, keypoint2, matches, img2, flags=2) 27 cv2.imshow("matches", img3) 28 cv2.waitKey() 29 cv2.destroyAllWindows()

 

FLANN匹配:

 

# coding:utf-8

import cv2 """ FLANN是類似最近鄰的快速匹配庫 它會根據數據本身選擇最合適的算法來處理數據 比其他搜索算法快10倍 """
# 按照灰度圖片讀入
img1 = cv2.imread("../data/logo1.png", cv2.IMREAD_GRAYSCALE) img2 = cv2.imread("../data/album1.png", cv2.IMREAD_GRAYSCALE) # 創建sift檢測器
sift = cv2.xfeatures2d.SIFT_create() # 查找監測點和匹配符
kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) """ keypoint是檢測到的特征點的列表 descriptor是檢測到特征的局部圖像的列表 """
# 獲取flann匹配器
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))] for i, (m, n) in enumerate(matches): if m.distance < 0.7*n.distance: matchesMask[i] = [1, 0] drawPrams = dict(matchColor=(0, 255, 0), singlePointColor=(255, 0, 0), matchesMask=matchesMask, flags=0) # 匹配結果圖片
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, matches, None, **drawPrams) cv2.imshow("matches", img3) cv2.waitKey() cv2.destroyAllWindows() 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM