Làm cách nào tôi có thể phát hiện các nút trong GUI của ứng dụng có phát hiện mẫu bằng python?


8

Tôi sẽ giải thích lấy ví dụ GUI của ứng dụng Máy tính trong windows. Khi ứng dụng Máy tính này mở và tập trung, tôi cần tìm cách phát hiện tất cả các nút. Tôi chỉ có thể sử dụng các phương pháp không xâm phạm, vì vậy những thứ như id nút không nằm trong câu hỏi. Điều này dẫn tôi đến nhận dạng hình ảnh. Hay nói tốt hơn là phát hiện hình ảnh, vì tôi không muốn một hình ảnh cụ thể, mà là một bộ hình ảnh theo một mẫu nhất định. Tôi biết làm thế nào tôi có thể nhấp / nhấp chuột phải / dbl-click / etc bằng cách sử dụng một hình ảnh nút và nhận dạng hình ảnh nhất định [1]. Tôi không biết làm thế nào tôi có thể thực hiện theo cách khác: quét GUI và tìm những khu vực đáp ứng các yêu cầu là nút (hình chữ nhật, văn bản / biểu tượng / đồ họa được dán nhãn, v.v.). Một cách giải quyết lớn hơn sẽ là phát hiện các mục không có hình chữ nhật (ví dụ: biểu tượng trên màn hình nền windows)

Điều gần nhất với những gì tôi cần là phát hiện khuôn mặt trong ảnh. [2] Nhưng tôi không biết làm thế nào để áp dụng điều này trong trường hợp của tôi. Để phát hiện khuôn mặt của con người, tôi thấy rằng hàng trăm hình ảnh khuôn mặt phải được sử dụng trong thế hệ thác Haar (không biết làm thế nào tôi sẽ làm điều này chỉ với 10 - 15 nút chụp nhanh). Nếu một loại đối tượng khác phải được phát hiện như một quả táo, bạn cần phải tạo tầng Haar cho đối tượng đó một lần nữa bằng cách sử dụng nhiều hình ảnh.

Có ai trong các bạn đã từng cố gắng phát hiện các nút, vật phẩm hoặc bất cứ thứ gì trong GUI chỉ bằng cách phát hiện mẫu không? Tôi chỉ cần một cái gì đó để nói với tôi "đây là một biểu tượng / nút" để tôi có thể lấy khu vực đó trong một ảnh chụp nhanh.

[1] Tôi sử dụng SikuliX với Python để thực hiện các hành động trên các mẫu đã cho.

[2] Tôi thấy rằng điều này được thực hiện dễ dàng bằng cách sử dụng các tầng OpenCV và Haar (ở định dạng XML). Tạo ra các ca khúc Haar đòi hỏi một chút kiên nhẫn và kỹ năng.

Câu trả lời:


7

Trước tiên, hãy xem mẫu squares.py do OpenCV cung cấp. Nó sẽ xử lý một số lượng lớn các loại nút với một số điều chỉnh.

Đây là đầu ra tôi nhận được (với một số điều chỉnh) cho ví dụ Máy tính của bạn: nhập mô tả hình ảnh ở đây

Tôi đã thực hiện các điều chỉnh sau đây cho ứng dụng hình vuông:

Thay đổi mã này (bắt đầu trên dòng 84):

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

Về điều này:

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

Ngoài ra, vì bạn không phải lo lắng về các biến thể tỷ lệ hoặc xoay, hãy kiểm tra bằng cách sử dụng matchTemplate . Ngoài ra, hướng dẫn tương ứng của nó (trong C ++) là ở đây .

Xem câu trả lời khác của tôi cho một ví dụ khác về cách hoạt động của mẫu phù hợp. Ngoài ra, bạn có thể thấy câu trả lời này hữu ích cho việc phát hiện các trận đấu X hàng đầu với matchTemplate.

Mong rằng sẽ giúp!


Cảm ơn rất nhiều cho câu trả lời của bạn. Tôi sẽ thử ý tưởng của bạn mặc dù tôi đang tìm kiếm thứ gì đó có thể mở rộng ra ngoài khu vực máy tính này. Cách tiếp cận này sẽ chỉ tuyệt vời cho các nút vuông. Không biết nó sẽ hoạt động như thế nào khi phát hiện các biểu tượng trên màn hình nền Windows (như tôi đã đề cập trong phần giải thích). Nhưng tôi sẽ thử nó và sẽ cho mọi người biết. Cảm ơn một lần nữa

Làm thế nào linh hoạt chương trình của bạn phải được? Vấn đề càng chung chung bạn càng cố gắng giải quyết; giải pháp sẽ càng khó đạt được.

Chà, hiện tại thì ổn thôi nếu tôi bám vào các ô vuông. Tôi có vấn đề lớn hơn. Giống như cái này (khi tôi chạy squares.py; Có ý kiến ​​gì không?): TracBack (cuộc gọi gần đây nhất vừa qua): Tệp "squares.py", dòng 144, trong <module> on_trackbar (0) Tệp "squares.py", dòng 126, trong on_trackbar drawSquares (img, findSquares4 (img, lưu trữ)) file "squares.py", dòng 30, trong findSquares4 PYR = cv.CreateImage (sz.width / 2, sz.height / 2, 8, 3) AttributeError : Đối tượng 'tuple' không có thuộc tính 'chiều rộng'
Radu Enea

Giải quyết vấn đề trên. Và sau rất nhiều nghiên cứu, tôi nghĩ rằng tôi phải viết lại câu hỏi.
Radu Enea

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.