2016-12-31 4 views
1

私は開いているcvでトランプカードを認識しようとしていますが、いくつか問題があります。まず、私は色(心、ダイヤモンド、スペード、クラブ)を認識したいと思います。私は赤い色を見つめていた。だから私は色を検出し、ダイヤモンドや心臓をカットして、分別して認識しようとする - 私は良い一致を選択し、より多くを持っている色を一致させる(私はその馬鹿だと確信していますが、私は次のように1のような結果を得る:SIFTメソッドは4つの図形を認識して悪い結果を出します

this

これは私のmatch関数のコードです:

def match(img, models): 
goods = [] 
for name, value in models: 
    sift = cv2.xfeatures2d.SIFT_create() 
    kp1, des1 = sift.detectAndCompute(name, None) 
    kp2, des2 = sift.detectAndCompute(img, None) 
    if des1 is None or des2 is None: 
     continue 
    bf = cv2.BFMatcher() 
    matches = bf.knnMatch(des1, des2, k=2) 
    good = [] 
    if matches is None: 
     continue 
    for m, n in matches: 
     if m.distance < 0.75 * n.distance: 
      good.append([m]) 
    img3 = cv2.drawMatchesKnn(img, kp1, name, kp2, good, None, flags=2) 
    plt.imshow(img3), plt.show() 
    goods.append([len(good), value]) 
maxi = 0 
ret = None 
for l, v in goods: 
    if l > maxi: 
     maxi = l 
     ret = v 
if maxi < 3: 
    return 0 
return ret 

何かヒントを持っている場合、私は感謝するでしょう。

+0

色の検出と作物が成功したので、ダイヤモンドか心臓かを分類するのは難しいですか? – ebeneditos

+0

はい、私はびっくりで問題があります – heheszki

+0

SIFTは形状を分類する際に強調しません、それは主に与えられた画像の特徴を分類/マッチングするために使用されるローカルinvarient記述子です。形状検出のために輪郭を取得し、色関連のもの。 –

答えて

0

それぞれの図形に1つずつ、4つのモデルイメージが必要です。

最初に色を分類する必要があるので、2つのモデル(ハート/ダイヤモンドまたはスペード/クラブのいずれか)と画像を比較すればよい。色はもはや重要ではないよう

さて、あなたは画像を2値化する必要があり、ガウス+大津は十分なはずです以下のように、それは行うことができます。

# Otsu's thresholding after Gaussian filtering 
blur = cv2.GaussianBlur(img,(5,5),0) 
ret, th = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) 

最後に、私はの特徴マッチングを行うだろうthには2つのモデル画像があり、より多くの特徴の数学(len(good))を取得するのはあなたが探しているものです。

モデルイメージは2進化する必要があり、同じサイズでなければなりません。

これが役に立った!

+1

ありがとう、その仕事:) – heheszki

関連する問題