【问题标题】:How can I detect if there is a piece on chess square or not?如何检测棋盘上是否有棋子?
【发布时间】:2016-02-28 07:01:12
【问题描述】:

我必须检测一个棋盘,我这样做如下图所示:

我把这张图片分成了 64 个子图,分别代表黑白棋子,比如:

如何检查这些子图像(每个方块)是否包含棋子?

【问题讨论】:

  • 检查this。如果你有一个空棋盘,你应该能够从两个图像的差异中得到棋子。
  • 使用基于 Haar 特征的级联分类器进行目标检测是一种有效的目标检测方法。使用 OpenCV 来训练您的模型以识别空白、黑色和上面的碎片。

标签: c++ opencv image-processing


【解决方案1】:

你需要考虑很多事情:

  • 有必要拥有这样的国际象棋视角吗?俯视图可以帮助您简化流程,这样做可以避免侵入其他方格。

  • 那么你可以通过检查它的直方图来检查一个方格中是否有棋子。如果正方形没有一块,您可以欣赏曲线中的一个峰值,如果该正方形中有一块,您将欣赏不止一个峰值。您可以在直方图中使用阈值来查找是否存在单个峰值(通过查找直方图中的最大点)

【讨论】:

    【解决方案2】:

    首先,您需要改进您的正方形检测,因为黑色中有一些白色区域,反之亦然。要快速做到这一点,您可以在正方形的中心裁剪一个较小的 ROI,假设大部分部分都在中心。

    对于实际检测,有各种简单的选项,我想在你的情况下它们会很好地工作。无需进行复杂的特征检测和机器学习。

    选项:

    • 如果您知道正方形的颜色,请使用一些阈值来找到该块。
    • 您可以查看正方形中灰度级的标准偏差。没有一块它会很低,所以你可以在这里使用一些阈值。
    • 您可以对一个空方块进行背景减法。

    无论哪种方式,都会有一些噪音,因此您必须稍微尝试一下才能找到最佳阈值/参数。 大多数情况下,最好进行一些预处理模糊以获得更平滑的结果。

    【讨论】:

    • 问题:如果棋子站在黑色场上,但它的“头”也挡住了“顶部”的白色场(从相机的角度来看)?
    • @Micka - 好点。我想一个明显的建议是从顶视图拍摄图像。更复杂的方法是查看每个检测的上下方块。然后你可以看到每一块的底部和顶部。
    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多