如何使用 python 检测具有模式检测的应用程序 GUI 中的按钮?

信息处理 图像处理 Python
2022-01-10 16:21:38

我将以 Windows 中计算器应用程序的 GUI 为例进行解释。鉴于此计算器应用程序已打开且集中,我需要找到一种检测所有按钮的方法。我只能使用非侵入性方法,因此按钮 ID 之类的东西是不可能的。这导致我进行图像识别。或者更好地说是图像检测,因为我不想要一个特定的图像,而是一组遵循某种模式的图像。我知道如何使用给定的按钮图像和图像识别来单击/右键单击/dbl-click/etc [1]。我不知道如何反过来:扫描 GUI 并找到那些满足按钮要求的区域(矩形、文本/图标/图形标记等)。更大的解决方法是检测没有矩形形状的项目(例如 Windows 桌面上的图标)

最接近我需要的是检测图片中的人脸。 [2] 但我不知道如何在我的情况下应用它。对于人脸检测,我看到在 Haar 级联生成中必须使用数百张人脸图片(不知道我将如何使用仅 10-15 个按钮快照来做到这一点)。如果必须检测另一种对象(例如苹果),则需要使用大量图像再次为该对象生成 Haar 级联。

你们有没有人尝试过仅使用模式检测来检测 GUI 中的按钮、项目或其他任何东西?我只需要一些东西来告诉我“这是一个图标/按钮”,这样我就可以在快照中抓取该区域。

[1] 我使用 SikuliX 和 Python 对给定模式执行操作。

[2] 我看到使用 OpenCV 和 Haar 级联(XML 格式)很容易做到这一点。创建 Haar 级联需要一点耐心和技巧。

2个回答

首先,看一下 OpenCV 提供的squares.py示例。它应该通过一些调整来处理相当数量的按钮类型。

这是我为您的计算器示例得到的输出(经过一些调整): 在此处输入图像描述

我对正方形应用程序进行了以下调整:

更改此代码(从第 84 行开始):

if(result.total == 4 and 
   abs(cv.ContourArea(result)) > 1000 and 
   cv.CheckContourConvexity(result)):

对此:

if(result.total == 4 and 
   abs(cv.ContourArea(result)) < 1300 and 
   abs(cv.ContourArea(result)) > 300 and
   cv.CheckContourConvexity(result)):

此外,由于您不必担心缩放或旋转变化,请使用matchTemplate进行检查。此外,它的相应教程(C++ 中)在这里

有关模板匹配如何工作的另一个示例,请参阅我的其他答案此外,您可能会发现此答案有助于检测与matchTemplate.

希望有帮助!

改写我的问题后,我得到了我正在寻找的答案。这是另一个例子,你必须知道要什么才能得到你需要的东西。这是页面: 如何使用 opencv 检测 GUI 元素? 谢谢您的帮助!