Como posso detectar botões em uma GUI de um aplicativo com detecção de padrões usando python?

8

Vou explicar como exemplo a GUI do aplicativo Calculadora no Windows. Como esse aplicativo da Calculadora é aberto e focado, preciso encontrar uma maneira de detectar todos os botões. Só posso usar métodos não intrusivos, para que coisas como a identificação do botão estejam fora de questão. Isso me leva ao reconhecimento de imagens. Ou melhor, diga detecção de imagem, porque não quero uma imagem específica, mas um conjunto de imagens que seguem um determinado padrão. Eu sei como posso clicar / clicar com o botão direito do mouse / dbl-click / etc usando uma determinada imagem de botão e reconhecimento de imagem [1]. Não sei como posso fazer o contrário: digitalize a GUI e encontre as áreas que atendem aos requisitos de ser um botão (retângulo, texto / ícone / gráfico marcado etc.). Uma abordagem maior seria detectar itens que não têm a forma de retângulo (por exemplo, ícones na área de trabalho do Windows)

A coisa mais próxima do que eu preciso é detectar rostos em uma imagem. [2] Mas não sei como aplicar isso no meu caso. Para a detecção de rosto humano, vi que centenas de fotos do rosto devem ser usadas na geração em cascata Haar (não sei como eu faria isso com apenas 10 a 15 instantâneos de botão). Se outro tipo de objeto precisar ser detectado como uma maçã, você precisará gerar a cascata Haar para esse objeto novamente usando muitas imagens.

Algum de vocês já tentou detectar botões, itens ou qualquer outra coisa em uma GUI usando apenas a detecção de padrões? Eu só preciso de algo para me dizer "este é um ícone / botão" para que eu possa pegar a região em um instantâneo.

[1] Eu uso o SikuliX com Python para executar ações em determinados padrões.

[2] Vi que isso é feito facilmente usando cascatas OpenCV e Haar (no formato XML). Criar as cacadas Haar requer um pouco de paciência e habilidades.

Radu Enea
fonte

Respostas:

7

Primeiro, dê uma olhada na amostra squares.py fornecida pelo OpenCV. Ele deve lidar com um número razoável de tipos de botões com alguns ajustes.

Aqui está a saída que obtive (com alguns ajustes) para o seu exemplo da Calculadora: insira a descrição da imagem aqui

Fiz os seguintes ajustes no aplicativo de quadrados:

Mude este código (começando na linha 84):

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

Para isso:

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

Além disso, como você não precisa se preocupar com variações de escala ou rotação, confira usando o matchTemplate . Além disso, seu tutorial correspondente (em C ++) está aqui .

Veja minha outra resposta para outro exemplo de como funciona a correspondência de modelos. Além disso, você pode encontrar esta resposta útil para detectar as principais correspondências X com matchTemplate.

Espero que ajude!

mevatron
fonte
Muito obrigado pela sua resposta. Tentarei sua idéia, embora esteja procurando algo que possa ser estendido fora desta área da calculadora. Essa abordagem seria ótima para botões quadrados. Não sei como se comportaria para detectar ícones em uma área de trabalho do Windows (como mencionei na explicação). Mas vou tentar e avisar a todos. Mais uma vez obrigado
Qual a flexibilidade do seu programa? Quanto mais geral o problema você tentar resolver; quanto mais difícil a solução será alcançada.
Bem, por enquanto está tudo bem se eu me ater aos quadrados. Eu tenho problemas maiores. Como este (quando executo squares.py; Alguma idéia?): Traceback (última chamada mais recente): Arquivo "squares.py", linha 144, em <module> on_trackbar (0) Arquivo "squares.py", linha 126, em on_trackbar drawSquares (img, findSquares4 (img, armazenamento)) O arquivo "squares.py", linha 30, em findSquares4 pyr = cv.CreateImage (sz.width / 2, sz.height / 2, 8, 3) AttributeError : objeto 'tupla' não tem atributo 'largura' #
Radu Enea
Resolvido o problema acima. E depois de muita pesquisa, acho que tenho que reformular a pergunta.
Radu Enea
0

Depois de reformular minha pergunta, obtive a resposta que estava procurando. Esse é outro exemplo que você precisa saber o que pedir para receber o que precisa. Aqui está a página: Como posso detectar elementos da GUI usando o opencv? Obrigado pela ajuda!

Radu Enea
fonte