2016-12-31 11 views
1

Я пытаюсь распознать игральные карты с открытым cv, но у меня есть некоторые проблемы. Во-первых, я хотел бы узнать цвет (сердца, бриллианты, лопаты или клубы). Я смотрел с красными красками. Таким образом, я обнаруживаю цвет и вырезаю алмаз или сердце и пытаюсь распознать с помощью фильтра - я выбираю хорошие совпадения и цвет соответствия, которые будут иметь больше (я уверен, что это глупо, но я не знал, как это сделать). Я получаю результат как один следующим образом:Метод 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

Да, у меня только проблема с sift – heheszki

+0

SIFT не подчеркивает классификацию фигур, это локальный инвариантный дескриптор, в основном используемый для классификации/сопоставления функций данного изображения, для определения формы вам нужно получить контуры, а затем проверить на sape или связанных с цветом. –

ответ

0

У вас должно быть 4 изображения модели, по одному для каждой формы.

Сначала вы должны классифицировать цвет, поэтому вам нужно сравнить изображение только с двумя моделями (сердце или алмаз или лопата/клуб).

Теперь, когда цвет не имеет значения больше, вы должны бинаризации изображения, Гаусс + Оца должна быть достаточно, это может быть сделано следующим образом:

# 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