Opencv之特徵匹配

2021-10-02 06:40:57 字數 3230 閱讀 4133

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對描述符進行匹配 匹配結...