Bagaimana saya bisa mendeteksi tombol dalam GUI aplikasi dengan deteksi pola menggunakan python?

8

Saya akan menjelaskan mengambil contoh GUI dari aplikasi Kalkulator di windows. Mengingat aplikasi Kalkulator ini terbuka dan fokus, saya perlu menemukan cara untuk mendeteksi semua tombol. Saya hanya dapat menggunakan metode yang tidak mengganggu, jadi hal-hal seperti id tombol tidak dapat dilakukan. Ini mengarahkan saya ke pengenalan gambar. Atau lebih baik mengatakan deteksi gambar, karena saya tidak ingin gambar tertentu, tetapi satu set gambar yang mengikuti pola tertentu. Saya tahu bagaimana saya bisa mengklik / klik kanan / klik-dbl / etc menggunakan gambar tombol yang diberikan dan pengenalan gambar [1]. Saya tidak tahu bagaimana saya bisa melakukan sebaliknya: memindai GUI dan menemukan area-area yang memenuhi persyaratan sebagai tombol (persegi panjang, teks / ikon / grafik berlabel dll). Menangani yang lebih besar akan mendeteksi item yang tidak memiliki bentuk persegi panjang (misalnya ikon pada desktop windows)

Hal terdekat dari yang saya butuhkan adalah mendeteksi wajah dalam sebuah gambar. [2] Tetapi saya tidak tahu bagaimana menerapkan ini dalam kasus saya. Untuk deteksi wajah manusia, saya melihat bahwa ratusan gambar wajah harus digunakan pada generasi kaskade Haar (tidak tahu bagaimana saya akan melakukan ini hanya dengan snapshot tombol 10-15). Jika jenis objek lain harus dideteksi seperti apel, Anda perlu membuat kaskade Haar untuk objek itu lagi menggunakan banyak gambar.

Apakah ada di antara Anda yang pernah mencoba mendeteksi tombol, item, atau apa pun dalam GUI hanya menggunakan deteksi pola? Saya hanya perlu sesuatu untuk memberi tahu saya "ini adalah ikon / tombol" sehingga saya dapat mengambil wilayah itu dalam sebuah snapshot.

[1] Saya menggunakan SikuliX dengan Python untuk melakukan tindakan pada pola yang diberikan.

[2] Saya melihat ini dilakukan dengan mudah menggunakan OpenCV dan Haar cascades (dalam format XML). Membuat Haar cacade membutuhkan sedikit kesabaran dan keterampilan.

Radu Enea
sumber

Jawaban:

7

Pertama, lihat contoh squares.py yang disediakan oleh OpenCV. Ini harus menangani cukup banyak jenis tombol dengan beberapa penyesuaian.

Ini adalah hasil yang saya dapat (dengan beberapa penyesuaian) untuk contoh Kalkulator Anda: masukkan deskripsi gambar di sini

Saya membuat tweak berikut untuk aplikasi kotak:

Ubah kode ini (mulai dari baris 84):

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

Untuk ini:

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

Selain itu, karena Anda tidak perlu khawatir tentang variasi skala atau rotasi, periksa menggunakan matchTemplate . Juga, tutorialnya yang sesuai (dalam C ++) ada di sini .

Lihat jawaban saya yang lain untuk contoh lain tentang cara kerja pencocokan templat. Juga, Anda mungkin menemukan jawaban ini bermanfaat untuk mendeteksi kecocokan X teratas dengan matchTemplate.

Semoga itu bisa membantu!

mevatron
sumber
Terima kasih banyak atas jawaban Anda. Saya akan mencoba ide Anda walaupun saya sedang mencari sesuatu yang dapat diperluas di luar area kalkulator ini. Pendekatan ini akan sangat bagus untuk tombol persegi. Tidak tahu bagaimana berperilaku untuk mendeteksi ikon di desktop windows (seperti yang saya sebutkan dalam penjelasan). Tapi saya akan mencobanya dan akan memberi tahu semua orang. Terima kasih lagi
Seberapa fleksibel program Anda seharusnya? Semakin umum masalah yang Anda coba selesaikan; semakin sulit solusinya.
Nah, untuk saat ini tidak apa-apa jika saya tetap pada kotak. Saya memiliki masalah yang lebih besar. Seperti ini (ketika saya menjalankan squares.py; Ada ide?): Traceback (panggilan terakhir terakhir): File "squares.py", baris 144, di <module> on_trackbar (0) File "squares.py", line 126, di on_trackbar drawSquares (img, findSquares4 (img, penyimpanan)) File "squares.py", baris 30, di findSquares4 pyr = cv.CreateImage (sz.width / 2, sz.height / 2, 8, 3) AttributeError : objek 'tuple' tidak memiliki atribut 'lebar'
Radu Enea
Memecahkan masalah di atas. Dan setelah banyak penelitian, saya pikir saya harus mengulangi pertanyaannya.
Radu Enea
0

Setelah mengulangi pertanyaan saya, saya mendapat jawaban yang saya cari. Itu contoh lain bahwa Anda harus tahu apa yang harus diminta untuk menerima apa yang Anda butuhkan. Inilah halamannya: Bagaimana saya bisa mendeteksi elemen GUI menggunakan opencv? Terima kasih untuk bantuannya!

Radu Enea
sumber