import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
def
cv_show
(name,img)
: cv2.imshow(name, img)
cv2.waitkey(0)
cv2.destroyallwindows(
)
img1 = cv2.imread(
'box.png',0
)img2 = cv2.imread(
'box_in_scene.png',0
)cv_show(
'img1'
,img1)
cv_show(
'img2'
,img2)
展示:
可以得到結果:img1中有603個特徵點,img2中有969個特徵點,因為從img1和img2本身的影象來看,img2中是包含img1的,所以進行特徵匹配的時候只會匹配img1和img2共有的603個特徵點。
ps:當然,這裡也可以分開來做,即先檢測特徵點再計算特徵。即:
kp1 = sift.detect(img1,
none
)kp2 = sift.detect(img2,
none
)kp1, des1 = sift.compute(img1, kp1)
kp2, des2 = sift.compute(img2, kp2)
此時,情況應分成進行1對1的匹配還是k對最佳匹配。
建立bf匹配器物件
函式介紹:
cv2.bfmatcher(normtype=cv2.norm_l2, crosscheck=true)
傳入引數:
bf = cv2.bfmatcher(normtype=cv2.norm_l2, crosscheck=
true
)
進行匹配操作
函式介紹:
bf.match(des1, des2)
輸出:dmatch型別的資料結構。
那麼這個這個dmatch資料結構究竟是什麼呢?
它包含三個非常重要的資料分別是queryidx,trainidx,distance。
matches = bf.match(des1, des2)
找出最匹配的十個特徵點並將它們用線連起來
函式介紹:
cv2.drawmatches(imagea, kpsa, imageb, kpsb, matches[:10], none, flags=2)
傳入引數:
matches =
sorted
(matches, key=
lambda x: x.distance)
img3 = cv2.drawmatches(img1, kp1, img2, kp2, matches[:10
],none
,flags=2)
cv_show(
'img3'
,img3)
得到結果:
k對最佳匹配是指,每乙個特徵點在另一張上都會有k個最匹配的點存在,例如k=2,它會給每個特徵點畫兩根匹配線。
實現方法與1對1匹配大同小異。
建立bf匹配器物件
注意,此時,crosscheck=false(預設)
bf = cv2.bfmatcher(
)
進行匹配操作
函式介紹:
bf.knnmatch(des1, des2, k=2)
輸出:knnmatch與match的返回值型別一樣,都是dmatch型別的資料結構,只不過一組返回的k(此處=2)個dmatch型別。
matches = bf.knnmatch(des1, des2, k=
2)
找出匹配的特徵點並將它們用線連起來
在這裡,每乙個特徵點(設為a)都有最匹配的另外兩個特徵點在另一張圖上,設為b和c。其中ab的距離最短,ac的距離次短。
那麼規定,如果ab間的距離小於ac間距離的0.75倍,則認為ab的匹配度遠遠大於a與其他任何點的匹配度,則將ab兩點連起來。
good =
for m, n in matches:
if m.distance <
0.75
* n.distance:
[m])
img3 = cv2.drawmatchesknn(img1,kp1,img2,kp2,good,
none
,flags=2)
cv_show(
'img3'
,img3)
得到結果:
opencv 特徵提取以及特徵匹配
用到的庫檔案 include include using namespace std opencv 特徵檢測模組 include include include 提取影象中的特徵 關鍵點 與 關鍵點的描述子,分別用到了opencv庫中的cv featuredetector和cv descriptor...
opencv特徵點匹配(暴力匹配優化)
1.knnmatch 方法,而k 1,返回一對匹配子,這個方法只返回最接近的距離的一對匹配子,當有足夠多的匹配子的時候,這種方法通常能夠產生最好的結果和最小的誤差。2.dmatch類 struct cv exports w dmatch 1 cv wrap dmatch int queryidx,i...
opencv 31 SIFT特徵匹配
使用siftfeaturedetector的detect方法檢測特徵存入乙個向量裡 可以使用drawkeypoints在圖中標識出來 使用siftdescriptorextractor的compute方法提取特徵描述符 特徵向量 特徵描述符是乙個矩陣 使用匹配器matcher對描述符進行匹配 匹配結...