十五天掌握OpenCV 特徵匹配

2021-09-28 17:18:43 字數 3825 閱讀 5912

匹配器物件

對sift描述符進行蠻力匹配和比值測試

flann匹配器

在影象間進行特徵匹配;

使用opencv中的蠻力(brute-force)匹配和flann匹配。

bf匹配器:先在第一幅影象選取一關鍵點,再依次與第二幅影象的每個關鍵點進行距離測試,最後返回距離最近的關鍵點。

使用cv2.bfmatcher()建立乙個bf-matcher物件。物件有兩個可選引數,乙個是normtype,乙個是布林變數crosscheck,預設值false。兩個方法,bfmatcher.match()返回最佳匹配,bfmatcher.knnmatch() 為每個關鍵點返回k(自定)個最佳匹配。

normtype:指定要使用的距離測試型別。預設值cv2.norm_l2,適於sift和surf演算法。cv2.norm_hamming適於使用二進位制描述符的orb、brief、brisk演算法,從而返回兩個測試物件之間的漢明距離。

若orb演算法引數vta_k==3或4,normtype=cv2.norm_hamming2.

crosscheck:設為true則匹配條件更嚴格。a中的第i個特徵點與b中的第j個特徵點彼此互為最近距離,才會返回最佳匹配(i,j)。

cv2.drawmatches() ——解釋:繪製匹配的點。先將兩幅影象水平排列,再在最佳匹配點之間繪製直線。

前面使用bf-matcher.knnmatch(),後面使用cv2.drawmatchesknn() 為每個關鍵點和其k個最佳匹配點繪製匹配線。k=2時,為每個關鍵點繪製兩條最佳匹配直線。傳入乙個掩模可以選擇性繪製。

設定查詢影象和目標影象;

使用特徵匹配的方法在目標影象中尋找查詢影象的位置;

使用orb描述符進行特徵匹配;

載入影象計算描述符;

建立乙個bfmatcher() 物件,然後使用matcher.match() 方法獲得兩幅影象的最佳匹配;

將匹配結果按特徵點之間的距離進行降序排列,從而把最佳匹配排前面;

繪製前十個匹配。

#按距離排序matches=bf.match(des1,des2)返回值是乙個dmatch物件列表。

dmatch物件具有下列屬性:

mactch.distance:描述符之間距離,取得越小越好。

dmatch.trainidx:目標影象中描述符的索引。

dmatch.queryidx:查詢影象中描述符的索引。

dmatch.imgidx:目標影象的索引。

使用bfmatcher.knnnmatch() 獲得k對最佳匹配。

)#初始化sift探測器

kp1,des1=sift.detectandcompute(img1,none)

kp2,des2=sift.detectandcompute(img2,none)

bf=cv2.bfmatcher(

)matches=bf.knnmatch(des1,des2,k=2)

#帶具體引數的bf匹配器

good=

for m,n in matches:

if m.distance < 0.75*n.distance:

[m])

""比值測試,首先獲取與a距離最近的點b(最近)和c(次近)

只有當b/c小於閾值(0.75)時才被認為是匹配的。當假設匹配是一一對應時,匹配的理想距離是0。"

""img3=cv2.drawmatchesknn(img1,kp1,img2,kp2,good[:10],flags=2)

plt.imshow(img3)

plt.show(

)flann匹配呼叫兩個字典作為引數,以確定要使用的演算法和其他引數。乙個是indexparams,乙個是searchparams。

indexparams:在sift和surf中,indexparams=dict(algorithm=flannindexkdtree,trees=5)

searchparams:指定遞迴遍歷的次數。值越高結果越準確,消耗時間越多。通過 searchparams=dict(checks=100) 修改值。

)kp1,des1=sift.detectandcompute(img1,none)

kp2,des2=sift.detectandcompute(img2,none)

flann_index_kdtree=0

index_params=dict(algorithm=flann_index_kdtree,trees=5)

search_params=dict(checks=50)

flann=cv2.flannbasematcher(index_params,search_params)

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]

draw_params=dict(matchcolor=

(0,255,0),

singlepointcolor=

(255,0,0),

matchesmask=matchesmask,

flags=0)

img3=cv2.drawmatchesknn(img1,kp1,img2,kp2,matches,none,**draw_params)

plt.imshow(img3)

plt.show(

)

實訓筆記十五天

jsp input標籤中text 和 password 可以通過以下方法來判斷是否為空 並且是否跳轉 function test01 else if hh02.value return flag 獲取到屬性輸出到div中 form表單物件的id屬性 function getformid form表單...

LinuxC 第十五天

靜態庫 靜態庫 要被包含到源程式中的庫 優點 執行速度快 缺點 占用系統資源比較多 使用的場合 對時間要求很高的場合 靜態庫的製作 1 把所有的源程式 c檔案 製作成目標檔案 o 檔案 gcc c mul.c o mul.o gcc c sub.c o sub.o gcc c add.c o add...

Qt第十五天

qwdialogsize.h ifndef qwdialogsize h define qwdialogsize h include namespace ui class qwdialogsize public qdialog endif qwdialogsize hqwdialogsize.cpp...