2017-12-07 11 views
0

2つの画像でSIFTを使用し、opencvのBFMatcherを使用してキーポイントに一致させようとしています。BFMatcherでの一致のOpenCVの長さ

ただし、一致の数はクエリ記述子の数と同じではありません。誰かが彼らが平等ではない理由を説明することはできますか?

docs match()function "クエリセットの各ディスクリプタに最適な一致を検出します。"

import cv2 
import numpy as np 

im1 = cv2.imread("trex1.png", cv2.IMREAD_GRAYSCALE) 
im2 = cv2.imread("trex2.png", cv2.IMREAD_GRAYSCALE) 

sift = cv2.xfeatures2d.SIFT_create() 
kp1, des1 = sift.detectAndCompute(im1, None) 
kp2, des2 = sift.detectAndCompute(im2, None) 

im_kp1 = np.zeros(im1.shape, dtype=np.uint8) 
im_kp2 = np.zeros(im1.shape, dtype=np.uint8) 
im_kp1 = cv2.drawKeypoints(im1,kp1,None) 
im_kp2 = cv2.drawKeypoints(im2,kp2,None) 

bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True) 
matches = bf.match(des1,des2) 

print len(des1) 
# Result : 78 
print len(des2) 
# Result : 71 
print len(matches) 
# Result : 55 

答えて

0

crossCheck=Trueは、結果の一部を削除しているため。

あなたがチェックした場合docs for the BFMatcher() constructor

クロスチェックそれがfalseの場合、これはそれが各クエリの記述のためのk最近傍を見つけたときのデフォルトBFMatcherの動作になりますです。 crossCheck == trueの場合、k = 1のknnMatch()メソッドは、i番目のクエリー記述子に対して、マッチャーのコレクション内のj番目の記述子が最も近いもの、つまりその逆であるように、対(i、j) BFMatcherは一貫性のあるペアのみを返します。このような技法は、通常、十分なマッチがある場合にアウトライア数を最小限にして最良の結果をもたらす。これは、SIFT論文のD. Loweによって使用される比率テストの代替方法です。

これが唯一のknnMatch()方法に影響を与えますそれのように読み取りますが、実際にexplicitly call knnMatch()match()方法は:

void DescriptorMatcher::match(InputArray queryDescriptors, std::vector<DMatch>& matches, InputArrayOfArrays masks) 
{ 
    CV_INSTRUMENT_REGION() 

    std::vector<std::vector<DMatch> > knnMatches; 
    knnMatch(queryDescriptors, knnMatches, 1, masks, true /*compactResult*/); 
    convertMatches(knnMatches, matches); 
} 

あなたがcrossCheck=False(または単に指定しない設定した場合、それはでFalseをですデフォルト)、次に取得します

len(query_descriptors) == len(matches) 
関連する問題