程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Opencv中的“暴力”特征匹配和FLANN特征匹配(python實現)

編輯:Python

文章目錄

    • 1.ORB關鍵點檢測,SURF關鍵點檢測,SIFT關鍵點檢測,Shi-Tomasi角點檢測,Harris角點檢測
    • 2.特征匹配的方法
    • 3.暴力特征匹配
    • 4.特征匹配步驟
      • (1)創建匹配器
      • (2)進行特征匹配
      • (3)進行特征匹配繪制點
    • 5.代碼實戰
    • 6.FLANN特征匹配
    • 7.FLANN步驟
      • (1)創建FLANN匹配器FlannBasedMatches(……)
    • (2)進行特征匹配:flann.match/knnMatch(……)
    • (3)繪制特征匹配點:cv2.drawMatches/drawMatchesKnn(……)
    • 8.代碼實戰

1.ORB關鍵點檢測,SURF關鍵點檢測,SIFT關鍵點檢測,Shi-Tomasi角點檢測,Harris角點檢測

Harris:
https://blog.csdn.net/Keep_Trying_Go/article/details/125384144
Shi-Tomasi:
https://blog.csdn.net/Keep_Trying_Go/article/details/125384218
SIFT:
https://blog.csdn.net/Keep_Trying_Go/article/details/125384278
SURF:
https://blog.csdn.net/Keep_Trying_Go/article/details/125384513
ORB:
https://mydreamambitious.blog.csdn.net/article/details/125384635


2.特征匹配的方法

(1)BF(Brute-Force),暴力特征匹配的方法;
(2)FLANN 最快鄰近區特征匹配方法;


3.暴力特征匹配

使用第一組中的每個特征的描述子與第二組中的所有特征描述子進行匹配;計算它們之間的差距,然後將接近一個匹配返回。


4.特征匹配步驟

(1)創建匹配器

Tf=cv2.BFMatcher(normType=None, crossCheck=None):
normType:NORM_L1(L1正則化), NORM_L2(L2正則化——默認值), NORM_HAMMING, NORM_HAMMING2.
crossCheck:是否進行交叉匹配,默認值為false;

(2)進行特征匹配

Tf.match(queryDescriptors, trainDescriptors, mask=None)
參數為SIFT,SURE,ORB,等計算的描述子;對兩幅圖的描述子進行計算。

(3)進行特征匹配繪制點

drawMatches(img1, keypoints1, img2, keypoints2, matches1to2, outImg, matchColor=None, singlePointColor=None, matchesMask=None, flags=None):

Img1:輸入搜索的圖
Keypoints1:輸入搜索的圖kp;
Img2:輸入匹配的圖
Keypoints2:輸入匹配的圖kp;
Matches1to2:從第一幅圖到第二幅圖的匹配
outImg:輸出繪制的結果圖形
matchColor:匹配連線關鍵點點的顏色,如果為-1,表示隨機顏色
singlePointColor:沒有匹配的關鍵點的顏色,-1代表為隨機顏色
matchesMask:確定繪制哪些匹配的掩碼,如果為空,這繪制所有的匹配項
Flags:繪圖的一些標志
(1)cv2.DRAW_MATCHES_FLAGS_DEFAULT:創建輸出圖像矩陣,使用現存的輸出圖像繪制匹配對和特征點,對每一個關鍵點只繪制中間點
(2)cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不創建輸出圖像矩陣,而是在輸出圖像上繪制匹配對
(3)cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:對每一個特征點繪制帶大小和方向的關鍵點圖形
(4)cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:單點的特征點不被繪制

函數返回匹配的結果;


5.代碼實戰

import os
import cv2
#讀取圖片和縮放圖片
img1=cv2.imread('images/img1.jpg')
img1=cv2.resize(src=img1,dsize=(450,450))
gray1=cv2.cvtColor(src=img1,code=cv2.COLOR_BGR2GRAY)
img2=cv2.imread('images/img2.jpg')
img2=cv2.resize(src=img2,dsize=(450,450))
gray2=cv2.cvtColor(src=img2,code=cv2.COLOR_BGR2GRAY)
#創建SIFT
sift=cv2.xfeatures2d.SIFT_create()
#計算特征點和描述點
kp1,des1=sift.detectAndCompute(gray1,None)
kp2,des2=sift.detectAndCompute(gray2,None)
#創建匹配器
tf=cv2.BFMatcher(cv2.NORM_L1)
#特這點匹配
match=tf.match(des1,des2)
#繪制匹配特征點
dest=cv2.drawMatches(img1=img1,keypoints1=kp1,img2=img2,keypoints2=kp2,matches1to2=match,outImg=None)
cv2.imshow('dest',dest)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
print('Pycharm')


6.FLANN特征匹配

優點:批量特征匹配時,FLANN速度快;
缺點:由於使用的是鄰近近似值,所以精度較差;


7.FLANN步驟

(1)創建FLANN匹配器FlannBasedMatches(……)

Index_params字典:匹配算法KDTREE,LSH;
Search_parames字典:指定KDTREE算法中遍歷樹的次數;
其中KDTREE的設置:
Index_params=dict(
Algorithm=FLANN_INDEX_KDTREE,
Trees=5
)
Search_params=dict(checks=50)

(2)進行特征匹配:flann.match/knnMatch(……)

knnMatch:參數為SIFT,SURE,ORB,等計算的描述子;k表示取歐式距離最近的前k個關鍵點;返回一個DMatch對象。
其中DMatch中的內容:
Distanc:描述子之間的距離,值越低越好;
queryIdx:第一幅圖的描述子索引值;
TrainIdx:第二幅圖的描述子索引值;
imgIdx:第二幅圖的索引值;


(3)繪制特征匹配點:cv2.drawMatches/drawMatchesKnn(……)

drawMatchesKnn(img1, keypoints1, img2, keypoints2, matches1to2, outImg, matchColor=None, singlePointColor=None, matchesMask=None, flags=None):

Img1:輸入搜索的圖
Keypoints1:輸入搜索的圖kp;
Img2:輸入匹配的圖
Keypoints2:輸入匹配的圖kp;
Matches1to2:從第一幅圖到第二幅圖的匹配
outImg:輸出繪制的結果圖形
matchColor:匹配連線關鍵點點的顏色,如果為-1,表示隨機顏色
singlePointColor:沒有匹配的關鍵點的顏色,-1代表為隨機顏色
matchesMask:確定繪制哪些匹配的掩碼,如果為空,這繪制所有的匹配項
Flags:繪圖的一些標志
(1)cv2.DRAW_MATCHES_FLAGS_DEFAULT:創建輸出圖像矩陣,使用現存的輸出圖像繪制匹配對和特征點,對每一個關鍵點只繪制中間點
(2)cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不創建輸出圖像矩陣,而是在輸出圖像上繪制匹配對
(3)cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:對每一個特征點繪制帶大小和方向的關鍵點圖形
(4)cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:單點的特征點不被繪制


8.代碼實戰

import os
import cv2
#讀取圖片和縮放圖片
img1=cv2.imread('images/img1.jpg')
img1=cv2.resize(src=img1,dsize=(450,450))
gray1=cv2.cvtColor(src=img1,code=cv2.COLOR_BGR2GRAY)
img2=cv2.imread('images/img2.jpg')
img2=cv2.resize(src=img2,dsize=(450,450))
gray2=cv2.cvtColor(src=img2,code=cv2.COLOR_BGR2GRAY)
#創建SIFT
sift=cv2.xfeatures2d.SIFT_create()
#計算特征點和描述點
kp1,des1=sift.detectAndCompute(gray1,None)
kp2,des2=sift.detectAndCompute(gray2,None)
#使用KDTREE算法,樹的層級使用5
index_params=dict(algorithm=1,trees=5)
search_params=dict(checks=50)
#創建匹配器
flann=cv2.FlannBasedMatcher(index_params,search_params)
#特征點匹配
match=flann.knnMatch(des1,des2,k=2)
#繪制匹配特征點
good=[]
for i ,(m,n) in enumerate(match):
if m.distance<0.7*n.distance:
good.append(m)
dest=cv2.drawMatchesKnn(img1=img1,keypoints1=kp1,img2=img2,keypoints2=kp2,matches1to2=[good],outImg=None,matchColor=(0,255,0))
cv2.imshow('dest',dest)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
print('Pycharm')


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved