Python opencv tìm hình ảnh trên màn hình

Tự động hóa bất kỳ loại nhiệm vụ nào cũng khá phức tạp và nhiệm vụ càng phức tạp thì càng khó tự động hóa. Vào lúc này hay lúc khác, nhu cầu về Nhận dạng hình ảnh với Pyautogui phát sinh để chúng ta có thể xác định vị trí các phần tử trên màn hình. Nếu không có tính năng này, chúng tôi sẽ gặp phải nhiều vấn đề, chẳng hạn như không thể tìm thấy một phần tử nếu vị trí của phần tử đó trên màn hình bị thay đổi một chút

Cách hoạt động của Nhận dạng hình ảnh trong PyAutoGUI

Trước tiên, chúng ta cần hiểu chính xác cách thức hoạt động của tính năng nhận dạng hình ảnh trong Pyautogui. Nói một cách đơn giản, PyAutoGUI có nhiều chức năng “xác định vị trí”, lấy hình ảnh nguồn làm tham số, sau đó cố gắng tìm kết quả khớp từ bất kỳ thứ gì hiện đang hiển thị trên màn hình của bạn. [Điều này có nghĩa là nếu bạn đang tìm kiếm thứ gì đó hiện đang được thu nhỏ hoặc nằm ngoài màn hình thì PyAutoGUI sẽ không thể tìm thấy nó]

Sau khi tìm thấy kết quả phù hợp, tùy thuộc vào chức năng được gọi, chúng ta có thể trả về tọa độ trên cùng bên trái hoặc đối tượng “Hộp”, với tọa độ trên cùng bên trái cũng như chiều rộng và chiều cao

Dưới đây là một số chức năng khác nhau mà chúng ta có thể sử dụng trong Pyautogui để Nhận dạng hình ảnh

  1. định vịOnScreen[hình ảnh] -> Trả về tọa độ [trái, trên cùng, chiều rộng, chiều cao] của phiên bản được tìm thấy đầu tiên của image trên màn hình
  2. định vịCenterOnScreen[hình ảnh] -> Trả về tọa độ x và y của tâm của phiên bản được tìm thấy đầu tiên của image trên màn hình
  3. định vịAllOnScreen[hình ảnh] ->  Trả về một danh sách với các bộ giá trị [trái, trên cùng, chiều rộng, chiều cao] cho mỗi hình ảnh được tìm thấy trên màn hình

Phát hiện hình ảnh với PyAutoGUI

Bây giờ chúng tôi sẽ chỉ cho bạn một ví dụ nhỏ về cách chúng tôi có thể áp dụng thực tế Nhận dạng hình ảnh trong Pyautogui và tự động hóa một tác vụ

ứng dụng máy tính

Chúng tôi sẽ tạo một chương trình đơn giản sử dụng ứng dụng Máy tính trong Windows và thực hiện một thao tác cộng đơn giản trên đó giữa hai số. Đây là giao diện của ứng dụng trên PC

Đối với chương trình này, tôi đã chụp ảnh màn hình 4 nút của nó, như hình bên dưới

Ghi chú. Những hình ảnh này, có thể hoặc không phù hợp với bạn. Các hàm Pyautogui để phát hiện hình ảnh cần kích thước hình ảnh chính xác, vì vậy nếu kích thước ứng dụng máy tính mặc định khác trên hệ thống của bạn, thì nó sẽ không trả về kết quả khớp. Tôi khuyên bạn nên tự chụp ảnh màn hình. [Tôi đã sử dụng công cụ Windows Snipping + Paint]

Bây giờ, hãy thử sử dụng một trong các chức năng được đề cập ở trên để phát hiện hình ảnh. Chúng tôi sẽ sử dụng cái chỉ trả về tọa độ x và y, vì chúng tôi không quan tâm đến chiều rộng hoặc chiều cao ngay bây giờ

import pyautogui

x, y= pyautogui.locateCenterOnScreen["5.jpg"]
pyautogui.moveTo[x, y, duration = 0.1]
pyautogui.leftClick[]

Bây giờ mã này sẽ làm gì, là tìm số 5 trên máy tính, di chuyển con trỏ chuột đến nó, rồi nhấp vào nó. Tuy nhiên, mã này và logic cơ bản khá phức tạp, vì vậy rất có thể bạn sẽ gặp lỗi ở đây

Hãy thử và phân tích tại sao những lỗi này có thể xảy ra và cách khắc phục chúng

Lỗi có thể xảy ra và lý do của chúng

1# Vấn đề rõ ràng nhất là bạn không mở Ứng dụng Máy tính trên màn hình. Tuy nhiên, ngay cả khi nó mở, vẫn có thể có vấn đề. Ví dụ: bạn đã thu nhỏ nó hoặc nó đang bị che bởi một số cửa sổ khác. Cả hai trường hợp này sẽ khiến nó thất bại

2# Có thể bạn đã thử thay đổi kích thước Cửa sổ Máy tính. Ví dụ: nếu hình ảnh bạn chụp có kích thước 20×20 và nút trên máy tính đã được thay đổi kích thước thành 40×40, thì nó sẽ không trả về kết quả khớp

3# [QUAN TRỌNG NHẤT] Bạn đã thử sử dụng

pip install opencv-python
0 thay vì
pip install opencv-python
1. [Và vâng, tôi biết tôi đã sử dụng một.
pip install opencv-python
2 trong ví dụ trên]. Tôi sẽ giải quyết vấn đề này trong phần tiếp theo chi tiết hơn

Sử dụng PyAutoGUI với OpenCV

[Đừng sợ tiêu đề, nó dễ hơn nhiều so với vẻ ngoài của nó, tin tôi đi]

Vấn đề với việc sử dụng pyautogui mặc định là nó chỉ tìm kiếm các kết quả khớp chính xác. Nhưng thường thì điều đó không thực tế lắm, vì có thể có những thay đổi nhỏ về màu sắc, tông màu, v.v. May mắn thay, pyautogui cung cấp một giải pháp đơn giản

Tất cả các hàm

pip install opencv-python
3 của nó đều có tham số
pip install opencv-python
4, có giá trị float nằm trong khoảng từ
pip install opencv-python
0 đến
pip install opencv-python
1. Giá trị mặc định là
pip install opencv-python
1, cho biết chỉ trả về kết quả khớp 100%. Mặt khác, nếu bạn đưa ra giá trị là
pip install opencv-python
3, giá trị này sẽ trả về các kết quả phù hợp chỉ khớp với ít nhất 80%

Bây giờ tôi đã đề cập trước đó rằng một

pip install opencv-python
0 sẽ [có khả năng] không hoạt động. Điều này là do họ áp dụng nén trên hình ảnh, điều này làm thay đổi một chút thành phần pixel, do đó nó trả về một ngoại lệ “không tìm thấy”. Sử dụng tham số độ tin cậy sẽ loại bỏ hoàn toàn vấn đề này. Chỉ cần đặt một giá trị như
pip install opencv-python
5 và nó sẽ không gây ra bất kỳ sự cố nào

Có một cảnh báo nhỏ cho điều này mặc dù. Bạn phải cài đặt OpenCV, vì nó phụ thuộc để tham số độ tin cậy hoạt động. Gói OpenCV đầy đủ hơi phức tạp để cài đặt, may mắn thay, có một phiên bản nhỏ hơn [với các tính năng ít hơn] mà chúng tôi có thể có đủ cho mục đích của chúng tôi

Chạy lệnh sau

pip install opencv-python

Bây giờ hãy quay lại mã của chúng tôi

Hoàn thành chương trình của chúng tôi

Tôi sẽ viết mã hoàn chỉnh ở đây, mà tôi đã sử dụng để tự động hóa tác vụ này. Hãy tự mình thử và cho tôi biết kết quả

import pyautogui

x, y= pyautogui.locateCenterOnScreen["5.jpg", confidence = 0.9]
pyautogui.moveTo[x, y, duration = 0.1]
pyautogui.leftClick[]

x, y= pyautogui.locateCenterOnScreen["plus.jpg", confidence = 0.9]
pyautogui.moveTo[x, y, duration = 0.1]
pyautogui.leftClick[]

x, y= pyautogui.locateCenterOnScreen["7.jpg", confidence = 0.9]
pyautogui.moveTo[x, y, duration = 0.1]
pyautogui.leftClick[]

x, y= pyautogui.locateCenterOnScreen["equals.jpg", confidence = 0.9]
pyautogui.moveTo[x, y, duration = 0.1]
pyautogui.leftClick[]

Thông thường, tôi sẽ cung cấp hình ảnh dưới dạng tải xuống, nhưng do nhiều vấn đề có thể xảy ra, tốt nhất là bạn nên tự mình thực hiện phần đó

Một tính năng thú vị khác mà PyAutoGUI có có thể hữu ích cho bạn, đó là khả năng Ảnh chụp màn hình. Điều này cho phép bạn chụp ảnh màn hình toàn màn hình hoặc các vùng cụ thể và lưu chúng vào một tệp

Ghi chú. Để có một dự án hoàn chỉnh dựa trên ý tưởng này, bạn sẽ cần chụp ảnh cho từng nút. Để làm cho nó thú vị hơn nữa, bạn có thể yêu cầu người dùng nhập biểu thức và chương trình sẽ tự động giải nó

Điều này đánh dấu sự kết thúc của Hướng dẫn nhận dạng hình ảnh với Pyautogui. Mọi đề xuất hoặc đóng góp cho CodersLegacy đều được chào đón. Các câu hỏi liên quan đến nội dung bài viết có thể hỏi ở phần bình luận bên dưới

Chủ Đề