Chuyển tới nội dung chính

Read Text (OCR) — Đọc văn bản

Đọc các giá trị động trên màn để node sau rẽ theo, gõ lại, hay nhấp theo chúng.

Mục đích

Đọc chữ từ một hoặc nhiều hình chữ nhật — tọa độ, vàng, đồng hồ, một từ trạng thái — và ghi vào biến.

Bạn nói vùng chứa gì (kiểu What to read) và nó tự tinh chỉnh engine OCR rồi sinh biến đúng kiểu. Bạn không cấu hình engine; bạn mô tả nội dung.

Khi nào dùng

  • Đọc con số cần so sánh — vàng, tải trọng, số slot.
  • Trích tọa độ để node sau hành động theo.
  • Đọc từ trạng thái để rẽ nhánh.
  • Đọc bộ đếm 3/5 hay đồng hồ 04:20.

Khi nào không dùng

  • Tìm nút hay biểu tượng — dùng Find Image. OCR chậm và kém tin hơn cho đồ họa.
  • Phát hiện trạng thái không chữ — dùng Check Region.
  • Kiểm chữ có tồn tại không — đọc nó, rồi dùng If với Is Empty.

Điều kiện

Hai thứ, thiếu là node Fatal:

  1. Engine OCR và ngôn ngữ phải sẵn sàng.
  2. Cổng tính năng ocrEnabled của flow phải bật.
OCR gác theo flow

Node Read Text hỏng ngay không output? Kiểm features.ocrEnabled trong flow settings trước khi gỡ vùng đọc. Đây là nguyên nhân phổ biến nhất.

Cách nó chạy

Thiết lập

Thiết lậpKiểuKhoảngMặc địnhTác dụng
Regionhình chữ nhậtphần trăm mànVùng cần đọc
What to read (Type)lựa chọnauto, text, number, counter, time, percentage, customautoTinh chỉnh OCR và quyết biến output
Read multiple regionsbooleanfalseĐọc nhiều vùng trong một node
Regionsdanh sách≤ 20Mục đa vùng, mỗi mục có biến, kiểu và làm sạch riêng
Outputsdanh sách≤ 8 mỗi vùngOutput tên → biến, với Default tùy chọn
Patternstring≤ 500 ký tựKiểu Custom: regex nhóm-đặt-tên
Auto convertbooleanSuy int/float/bool theo nhóm bắt
Character whiteliststring≤ 200 ký tựEngine chỉ nhận diện các ký tự này
Post-processdanh sách≤ 16 bướcLàm sạch có thứ tự: raw, digits, whitelist, regexFilter
Languagestring≤ 32 ký tựAutoNgôn ngữ OCR; rỗng = mặc định cấu hình
Timeoutinteger1–120000 ms5000Thử lấy chữ mới trong bao lâu
Poll intervalinteger50–120000 ms250Chụp lại thường xuyên cỡ nào

Các kiểu nội dung

Thiết lập quan trọng nhất. Chọn đúng kiểu hơn mọi tinh chỉnh tay.

KiểuSinh raDùng cho
autoChữ thôKhi thật sự không biết
textChuỗiTừ trạng thái, tên
numberMột sốVàng, tải, mọi giá trị sẽ so sánh
counter<tên>_current<tên>_maxBộ đếm kiểu 3/5
time<tên>_hours<tên>_minutesĐồng hồ 04:20
percentageMột số85%
customMột biến mỗi nhóm regex đặt tênChữ có cấu trúc như tọa độ
Chọn kiểu cụ thể, đừng Auto

Auto trả chữ thô. Chuỗi thô "1167" không phải số, nên {{gold}} > 100 âm thầm hỏng. Chọn Number làm phép so chạy.

Trích xuất regex Custom

Kiểu custom nhận regex với nhóm đặt tên và sinh một biến mỗi nhóm:

Pattern: X:(?P<x>\d+)\s+Y:(?P<y>\d+)
Màn hình: X:1167 Y:1120
Kết quả: x = 1167 y = 1120 (dạng số)

Pattern phải chứa ít nhất một nhóm đặt tên (?P<name>…). Pattern sai hoặc không nhóm làm node Fatal trước cả khi chụp — nó không âm thầm trích ra rỗng.

Đọc không phân tích được thì để trống

Number hay Counter không phân tích được ghi trống, không phải 0.

Chủ đích: số 0 bịa sẽ âm thầm chảy vào phép so và quyết sai. Giá trị trống thì hiện hình. Cấp Default theo output nếu muốn dự phòng cụ thể.

Vì vậy, khai biến gắn OCR là nullablenumber?, không phải number.

Đọc đa vùng

Một node, nhiều hình chữ nhật, mỗi cái ghi biến riêng. Dùng khi cần hai ba giá trị liên quan từ một màn — đọc trong một node nghĩa là một ảnh chụp, không phải ba.

Mỗi vùng mang kiểu, làm sạch và default riêng, nên giá tiền chỉ-số nằm được cạnh nhãn chữ.

Chỉ biến phẳng

Kiểu có cấu trúc ghi tên phẳng (slot_current, không phải slot.current). Vì tham chiếu {{name}} phân giải theo tên phẳng — object lồng dùng được trong If nhưng hỏng khi làm tọa độ Click.

Port

PortĐi vào khiBắt buộc
SuccessĐọc hoàn tất — kể cả vùng trống. Không chữ không phải thất bạiKhông
FailureKhông khung mới trong timeout, hoặc pattern Custom không khớp gìKhông
CancelledLần chạy dừng giữa đọcKhông — không bao giờ được đi
FatalEngine OCR thiếu, không ngôn ngữ, vùng sai, regex Custom hay post-process saiKhông — không bao giờ được đi
Failure không nghĩa là "không chữ"

Đọc trơn thành công cả khi không thấy chữ. Failure nghĩa là không chụp được khung, hoặc pattern Custom không khớp. Muốn rẽ theo chữ rỗng, đọc rồi dùng If Is Empty.

Ví dụ cơ bản

Đọc bộ đếm vàng:

  • Region: hình chữ nhật sát quanh con số
  • What to read: Number
  • Biến: gold

Rồi {{gold}} > 1000 chạy như phép so số.

Ví dụ thực tế — đọc tọa độ rồi quyết

Một lần OCR biến nhãn trên màn thành hai biến số điều khiển một quyết định thật.

Ví dụ nâng cao — kiểm sức chứa đa vùng

Đọc hai bộ đếm slot trong một node và dừng khi hàng đợi đầy:

  • Read multiple regions: bật
  • Vùng 1 → slot_1, Kiểu Counter → sinh slot_1_current, slot_1_max
  • Vùng 2 → slot_2, Kiểu Counter → sinh slot_2_current, slot_2_max

Rồi một If chế độ biểu thức:

{{slot_1_current}} == {{slot_1_max}} || {{slot_2_current}} == {{slot_2_max}}

rẽ về Stop: success với thông điệp "All slots full".

Một node, một ảnh chụp, bốn biến đúng kiểu, một quyết định.

Best practices

  • Vẽ vùng sát đúng phần chữ. UI xung quanh là nguyên nhân chính của đọc hỏng.
  • Luôn chọn Kiểu cụ thể thay vì Auto.
  • Phóng to trước với chữ nhỏ. Độ chính xác OCR phụ thuộc mạnh cỡ glyph — cặp với Zoom.
  • Khai biến OCR nullable (number?) để lần đọc không phân tích được không đánh rớt lần chạy.
  • Dùng Test Node xem trước kết quả đọc và biến trích trước khi chạy flow.
  • Dùng đa vùng thay vì nhiều node Read Text đọc cùng một màn.
  • Dùng làm sạch chỉ-số cho trường số dính ký tự lạ.

Ghi chú hiệu năng

  • OCR đắt hơn hẳn so khớp template. Ưu tiên Find Image khi chỉ cần biết thứ gì hiện diện.
  • Chi phí theo diện tích vùng. Vùng sát vừa nhanh vừa chính xác hơn.
  • Đọc đa vùng chia một ảnh chụp, nên hai vùng một node rẻ hơn hẳn hai node.
  • Whitelist ký tự tăng tốc engine và tăng độ chính xác, vì thu hẹp không gian tìm.
  • Timeout mặc định 5000 ms poll 250 ms — chừng 20 lượt ở ca xấu nhất. Hạ timeout cho giá trị hoặc có ngay hoặc không có.

Ghi chú bộ nhớ

  • Mỗi poll chụp khung mới và chạy pipeline OCR trên mảnh cắt. Khung tạm thời nhưng pipeline cấp phát theo lượt.
  • Đa vùng xử lý từng vùng trên cùng một khung chụp, nên bộ nhớ theo số vùng, không theo số lần chụp.
  • Biến trích là biến flow thường, sống trọn lần chạy.

Lỗi thường gặp

LỗiHậu quảCách sửa
Dùng Auto rồi so sốPhép so âm thầm hỏng trên chuỗiKiểu Number
Vùng dính UI xung quanhKém chính xácThu vùng
Kỳ vọng Failure khi không chữĐọc trơn thành côngIf → Is Empty
Regex Custom không nhóm tênFatal trước chụpThêm (?P<name>…)
Biến không-nullable gắn OCRLần chạy rớt TYPE_MISMATCHKhai number? / string?
Quên ocrEnabledNode Fatal tức thìBật trong flow settings
Đọc chữ li ti không zoomĐọc phập phùPhóng to trước

Khắc phục sự cố

Node Fatal ngay lập tức. Kiểm features.ocrEnabled trong flow settings, rồi regex Custom nếu dùng.

Số về trống. Không phân tích được thành số. Trống là chủ đích — kiểm vùng, cân nhắc làm sạch chỉ-số hay Default.

Phép so {{gold}} > 100 không bao giờ nổ. Giá trị là chữ, không phải số. Chuyển kiểu Number.

Đọc phập phù giữa các lần chạy. Vùng có lẽ dính mép nền thay đổi. Thu vùng, hoặc thêm whitelist ký tự.

Pattern Custom thi thoảng rẽ Failure. Pattern không khớp gì trên khung đó. Nới pattern, hoặc nối Failure vào đường thử lại.

FAQ

Vùng trống nghĩa là Failure? Không — Success. Chỉ khung thiếu hoặc pattern Custom không khớp mới rẽ Failure.

Một node đọc mấy vùng? Tối đa 20.

Sao biến bộ đếm của tôi tên slot_current? Kiểu có cấu trúc ghi tên phẳng để {{name}} phân giải khắp nơi.

Đặt dự phòng khi đọc hỏng được không? Được — Default theo output.

OCR hay Find Image nhanh hơn? Find Image, cách biệt lớn. Chỉ dùng OCR khi cần giá trị.

Node liên quan

  • Find Image — định vị đồ họa
  • Check Region — trạng thái không chữ
  • If — rẽ theo thứ đã đọc
  • Variable — lưu và tính
  • Zoom — phóng to chữ nhỏ trước

Trang liên quan