【问题标题】:How can I capture images from the screen and compare them to known images in C++?如何从屏幕上捕获图像并将它们与 C++ 中的已知图像进行比较?
【发布时间】:2013-02-02 01:41:41
【问题描述】:

为了看看是否可以轻松破解非常简单的验证码,我正在尝试编写一个程序(尽可能简单和小)。我希望用 C++ 编写的这个程序应该执行以下操作:

  1. 制作屏幕已知区域的部分屏幕截图。 (假设 CAPTCHA 始终位于完全相同的位置 - 例如:像素 500-600 x,像素 300-400 y)。

  2. 自动将 CAPTCHA 分解为单个字母。 (我将为测试创建的验证码都只有几个白色字母,总是在黑色背景上,间隔很好,以方便我。)

  3. 然后,程序将“剪切”的字母与一组“已知”的字母图像(看起来类似于 CAPTCHA 中使用的字母)进行比较,其中包含 26 个元素,每个元素包含一个单一的图像英文字母。

  4. 程序获取与比较映射到的图像相关联的字母,并将该键发送到控制台(通过 std::cout)

我的问题是:是否有一个易于使用的库(我只是编程的初学者),它可以处理任务 1-3(4. 相当容易)?特别是第三点是我几乎没有发现任何值得的东西。理想的情况是,如果这个库有一个“评分”功能,使用浮点数来指示图像的相似程度。然后,得分最高的就是最好的命中。 (即:100.0 表示图像相同,29.56 表示它们非常不同,等等)

【问题讨论】:

  • 您所描述的验证码比stackoverflow.com/a/13665185/1832154 的“破解”更简单。那里的代码非常简单,使用 opencv 甚至其他较小的库将其映射到 c++ 应该没有问题。
  • 我很确定截屏是相当依赖于系统的。你用的是哪个系统?
  • 啊,是的,有截图。我完全忽略了它,因为它与解决问题的任务完全不同,只是在给定平台的情况下调用程序。
  • 我使用的是 Windows 7。请原谅我忘记提及这一点。

标签: c++ image-processing captcha


【解决方案1】:

这个工作的一个很好的库是 OpenCV。 http://opencv.org

OpenCV 拥有所有必要的低级图像处理工具来分割验证码的不同元素。然后就可以使用它的模板匹配模块了。

您甚至可以尝试在不进行预处理的情况下直接检测字母。它会更慢,但验证码图像通常很小,几乎不重要。看: http://docs.opencv.org/modules/imgproc/doc/object_detection.html#cv2.matchTemplate

有关进入图书馆的一些教程,请参阅: http://docs.opencv.org/doc/tutorials/tutorials.html

【讨论】:

  • 非常感谢。这看起来非常像我梦寐以求的任何东西。我已将此标记为已接受的答案。向你致敬。
猜你喜欢
  • 1970-01-01
  • 2012-12-02
  • 2017-08-07
  • 2016-09-05
  • 2019-09-15
  • 2015-06-17
  • 2021-03-03
  • 2021-06-02
  • 1970-01-01
相关资源
最近更新 更多