匹配器物件
對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...