2016-12-31 60 views
1

我試圖識別打開的簡歷,但我有一些問題。首先,我想要認識顏色(心,鑽石,黑桃或俱樂部)。我盯着紅色。所以我檢測顏色,並切割鑽石或心臟,並嘗試認識篩選 - 我選擇良好的比賽和匹配的顏色,將有更多的(我敢肯定它的愚蠢,但我沒有任何想法如何做到這一點)。我得到結果就像一個如下:SIFT方法給我不好的結果,識別4個形狀

this

這是我的匹配函數的代碼:

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沒有在分類形狀上表現出emphsize,它是局部不變的描述符,主要用於分類/匹配給定圖像的特徵,對於形狀檢測,您需要獲取輪廓,然後檢查sape或顏色相關的東西。 –

回答

0

您應該有4個模型圖像,每個形狀一個。

首先,您應該對顏色進行分類,因此您只需將圖像與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))是你正在尋找的。

請注意,模型圖像必須進行二值化處理,且尺寸應相同。

希望這有助於!

+1

謝謝,它的工作:) – heheszki