【问题标题】:Recognizing colors/patterns in webpage识别网页中的颜色/图案
【发布时间】:2011-08-09 10:14:28
【问题描述】:

我想尝试创建一个学习国际象棋应用程序作为学校项目。我的第一个计划是简单地让这个 AI 与自己对抗,但要真正展示它是否成功,它需要能够展示它的进展情况。为了做到这一点,我希望它在 chess.com 等网站上玩评级游戏。但是,我相信他们(还)没有公共 API。

因此,我想用 java 制作一个识别颜色和图像的程序。它保留所有位置的内部二维数组,并识别板上的棋子。我想我已经找到了一种在窗口中使用Java Robot Class 之类的方法来执行此操作。

但是,我希望它在内部窗口中打开此网页并在后台继续执行此操作。有没有办法在自己的窗口中识别颜色,而不需要在前景中?

编辑:我打算使用this browser component i just found。我注意到可以创建页面的整页快照并将其保存为 BufferedImage(?)。这样做会更容易吗?

编辑 2:我刚刚读到“完全禁止来自其他人、计算机/国际象棋引擎或残局表库的外部帮助”。我想让电脑完成所有的演奏当然也包括在内。所以我可能会尝试使用其他网站,所以特定于 chess.com 的答案不会削减它!

【问题讨论】:

    标签: java image-recognition chess awtrobot


    【解决方案1】:

    我不确定您的输入是什么,但您有两个选择:

    1. 您可以处理 PNG 图像。将图像加载到BufferedImage (docs) 对象中并在那里检查它。您可以使用屏幕截图工具来创建这些。

    2. 似乎 chess.com 使用 HTML 和 JavaScript。您可以使用HttpComponents 下载 HTML 并检查它以查看各个部分的位置。由于 HTML 包含源信息,因此您不必猜测哪一部分会放在哪里。

    【讨论】:

    • 如何分析 BufferedImage?我有一些应用滤色器的计划,这样你一次只能看到一个玩家,但是有没有一种简单的方法来识别棋子的图像?
    • 否;但你说你已经有了识别图像片段的代码。如果没有,您需要研究 OCR(光学字符识别)。在您的情况下,计算字段中黑色像素的数量可能就足够了。对于所有 15 个棋子,该数字应该不同。
    • 如果您被允许使用高级 API,则为每个部分创建一个图像并使用 Sikuli 在您的板上找到相似的模式。在我的帖子中可能不是很清楚,但 Sikuli 是一个 OCR 和模式匹配程序。
    • 啊,谢谢 :) 我还没有任何代码,我有代码、工作流等计划。
    • 好的。在这种情况下,您可以检查图像的各个像素。文档包含大量示例。
    【解决方案2】:

    我不知道它是否有帮助,但也许你可以看看 Sikuli 项目。 http://sikuli.org/

    Sikuli 是一个程序(和一个 API),用于处理与用户界面的交互。例如,您可以编写脚本以在特定条件下单击图像或按钮。

    你特别感兴趣,有一个 Java 集成:http://sikuli.org/docx/faq/030-java-dev.html

    这里是网站的摘录,让您了解可以编写的代码。

    编辑:在此代码中,重要的是要注意您正在使用图像定义新模式。 Sikuli 将能够找到匹配的模式。

    import org.sikuli.script.*;
    
    public class TestSikuli {
    
        public static void main(String[] args) {
                Screen s = new Screen();
                try{
                        s.click("imgs/spotlight.png", 0);
                        s.wait("imgs/spotlight-input.png");
                        s.type(null, "hello world\n", 0);
                }
                catch(FindFailed e){
                        e.printStackTrace();
                }
        }
    }
    

    【讨论】:

    • 这看起来正是我需要的!谢谢,我会试试这个:)
    【解决方案3】:

    您应该考虑在提供 API 且允许使用国际象棋引擎的国际象棋服务器上玩。有The Internet Chess Club (ICC),您必须付费才能拥有一个人工帐户,然后您可以为您的引擎获得一个免费的计算机帐户。还有Free Internet Chess Server (FICS),您和您的引擎可以在其中获得免费帐户。

    ICC通常是首选,因为那里的玩家水平较高,有很多国际高手和国际象棋大师在那里玩。

    与这些站点交互的最佳方式是实现xboard protocol。这将允许您的引擎通过 Winboard 或 XBoard 接口(以及其他接口)播放,这些接口可用于连接 FICS 或 ICC 并在那里自动播放。

    我希望这会有所帮助,即使它没有直接回答问题。

    【讨论】:

    • 这是一些很棒的信息!我以前看过那个网站,但总是以某种方式跳过它。我会尝试实现这一点,非常感谢!这些是我希望我能接受 2 个答案的场合......两者都解决了我的问题。非常感谢!
    • 嗯,当我注册时,我不得不说我不会从 a.o. 那里得到任何帮助。电脑。完全计算机控制的帐户怎么样?会不会有点违反这条规则?
    • 一旦你注册了你的个人账户,你就可以申请一个计算机账户,如果我没记错的话,这样的申请是通过电子邮件完成的。以下是 FICS 的信息:freechess.org/Help/HelpFiles/computers.html。如果您不接受我的回答也没关系,因为我并没有真正回答您提出的问题。
    • 好的,再次感谢!我会接受另一个,太糟糕了,我不能给你一个以上的支持;)
    • -1。答案是错误的,应该被否决。在 ICC 上玩游戏不需要 XBoard 协议。请不要写错答案,误导他人。
    猜你喜欢
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2011-10-08
    相关资源
    最近更新 更多