【问题标题】:detect card symbol using opencv python使用opencv python检测卡片符号
【发布时间】:2017-05-29 12:12:21
【问题描述】:

我试图找出黑桃、梅花、菱形和哈特之间的区别。卡片上的数字无关紧要,重要的是花色。

我已经尝试通过仅查看红色或黑色来进行颜色检测,但这仍然让我得到每种颜色的两个结果。我如何确保我可以单独检测每个符号?

例如:我有一张红色公鹿、红色菱形、黑色铁锹和黑色梅花的图片。我想用不同的颜色绘制每个符号的轮廓。

我正在使用我的网络摄像头作为相机。

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    如果你的牌的花色总是相同的(只有一种牌),你可以只存储黑桃、梅花、菱形和哈特的图像,然后检查给定图像与你的参考的互相关并选择最高值(请参阅this question)。如果您有一个相当大的样本集,其中包含不同种类的卡片,它们的花色表示之间存在细微差异,您几乎可以按照this tutorial 对您的训练集进行四向分类,并使用支持向量机、聚类或其他方法,在 open-cv 中可用。

    希望这会有所帮助,一切顺利

    【讨论】:

    • 嗯,我基本上有一个符号,我需要能够识别的哈特、黑桃、梅花和菱形,没有使用真正的扑克牌
    【解决方案2】:

    我没有看到任何代码,所以无法真正调整你所拥有的,但更一般地说,你应该能够训练它,除了符号而不是颜色:

    这是一个用于制作特定卡片的示例代码。您可以将它们训练为特定于卡片,从而通过特定卡片捕获所有符号,或者备份它并更一般地训练符号(心形/菱形)。您还应该在 opencv 上查看template matching

    在 github 上有一些指南和code already completed

    Here is a tutorial worth reading

    【讨论】:

    • 是不是忘记附上做特定卡片的示例代码,还是在github页面上?
    【解决方案3】:

    由于卡片符号在固定位置,您可以尝试如下(例如在OpenCV 3.2Python):

    1. 裁剪左上角的符号,image = image[h1:h2,w1:w2]
    2. 将符号颜色设为黑色,其余设为白色,thresh = mask = cv2.inRange(image,(0,0,0),(100,100,100))
    3. 执行查找轮廓检测,_, contours, hierarchy = cv2.findContours()
    4. 获取轮廓的面积大小。 area = cv2.contourArea(contour)
    5. 比较该区域以确定它属于 4 个符号中的哪一个。

    您必须在其中建立每个符号的面积阈值,以便第 4 步进行比较。以上所有cv2函数仅供参考。

    希望对您有所帮助。

    【讨论】:

    • 抱歉,回复晚了,但没有。我需要能够在不同距离实时检测到它们,所以轮廓区域对我不起作用
    • @user3499284 我明白了。那么,您找到解决方案了吗?
    • 我还没有找到解决方案,我尝试了 haar 级联、模板匹配、颜色检测(这不起作用,因为每种颜色有两个符号)。我也尝试过基于边缘检测对象,这仅适用于红色菱形
    【解决方案4】:

    除非你有严重的透视变形(无论如何它可能会起作用),template matching 非常有效。您可以分别在红色和黑色通道中运行它(显然不要寻找红色黑桃等)。

    看看例如(不是我的)

    http://www.pyimagesearch.com/2015/01/26/multi-scale-template-matching-using-python-opencv

    关于扑克牌,另见https://github.com/arnabdotorg/Playing-Card-Recognition

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-10
      • 2020-03-09
      • 2023-04-10
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多