SIFT 方法给我不好的结果,识别 4 种形状

SIFT method give me bad results, recognizing 4 shapes

我正在尝试用 open cv 识别扑克牌,但我遇到了一些问题。首先,我想识别颜色(红心、方块、黑桃或梅花)。我正盯着红色。所以我检测颜色,切割钻石或心形并尝试用筛选识别 - 我选择好的匹配和匹配的颜色会有更多(我敢肯定它很愚蠢,但我不知道如何做到这一点)。我得到如下结果:

这是我的匹配函数的代码:

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

如有指点,将不胜感激

您应该有 4 张模型图像,每个形状一张。

首先你应该对颜色进行分类,所以你只需要将图像与 2 个模型(heart/diamond 或 spade/club)进行比较。

现在颜色已经不重要了,要对图像进行二值化,一个Gauss+Otsu就可以了,可以这样操作:

# 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)) 就是您要找的图像。

请注意,模型图像必须二值化并且大小应该相同。

希望对您有所帮助!