5.6. Vẽ hình dạng và văn bản

Một thuật toán đưa ra quyết định về ảnh thường cần quyết định đó phải được hiển thị. Một bộ phát hiện vùng màu (blob) tìm thấy một vùng mà ứng dụng quan tâm; ứng dụng muốn vùng đó được vẽ lên khung hình để người vận hành -- hoặc nhà phát triển đang chạy tập lệnh -- có thể thấy kết quả tìm thấy. Một phép biến đổi tọa độ ánh xạ vị trí đầu vào sang vị trí đầu ra; gỡ lỗi thường có nghĩa là đánh dấu hai vị trí trên cùng một ảnh. IDE preview đọc bất cứ thứ gì nằm trong bộ đệm khung hình tại thời điểm nó thăm dò, vì vậy cách đơn giản nhất để làm hiển thị đầu ra thuật toán là ghi chú thích vào bộ đệm khung hình. Nhóm vẽ trên lớp Image là bộ công cụ cho chính xác công việc đó.

5.6.1. Các phép vẽ cơ bản

Mỗi phương thức vẽ đặt một loại dấu cụ thể lên ảnh. Danh mục rất nhỏ và bám sát các hình học cơ bản mà chú thích thực sự cần:

  • draw_line() -- một đoạn thẳng giữa hai điểm cuối.

  • draw_rectangle() -- một hình chữ nhật căn chỉnh theo trục, rỗng hoặc đặc.

  • draw_circle() -- một hình tròn xung quanh một tâm, rỗng hoặc đặc.

  • draw_ellipse() -- một hình ellipse với góc xoay tùy ý.

  • draw_cross() -- dấu cộng tại một điểm, dấu thông thường cho tâm khối lượng hoặc mục tiêu nhấp.

  • draw_arrow() -- một mũi tên từ điểm bắt đầu đến điểm kết thúc.

  • draw_edges() -- bốn cạnh của một tứ giác tùy ý, được cho bởi bốn điểm góc; cách tự nhiên để phác thảo một thẻ được phát hiện hoặc một vùng biến dạng phối cảnh.

  • draw_string() -- văn bản từ phông chữ bitmap tích hợp sẵn.

Tất cả các phương thức này đều chỉnh sửa ảnh nguồn tại chỗ và trả về cùng ảnh đó để có thể gọi nối tiếp, theo quy ước phương thức hoạt động đã được thiết lập trước đó.

A grid of small panels showing each of the eight drawing primitives applied once. Each panel contains a line, a rectangle, a circle, an ellipse, a cross, an arrow, a quadrilateral, or a short text string, with the name of the method that produced it labelled underneath.

Tám phép vẽ cơ bản, mỗi ô một phép. Mỗi phương thức tạo ra một loại dấu.

5.6.2. Màu sắc

Mỗi phương thức vẽ nhận một đối số color quyết định giá trị nào được ghi vào mỗi điểm ảnh được tô màu. Dạng của đối số đó phụ thuộc vào định dạng của ảnh. Đối với ảnh RGB565, dạng tự nhiên là một tuple (r, g, b) với mỗi kênh trong khoảng 0 -- 255; module đóng gói đó xuống thành từ RGB565 16-bit trước khi ghi. Đối với ảnh thang xám, dạng tự nhiên là một số nguyên độ sáng từ 0 (đen) đến 255 (trắng). Các phương thức cũng chấp nhận giá trị thô được lưu trữ của định dạng -- một từ đóng gói 16-bit cho RGB565, một số nguyên 8-bit cho thang xám -- đây là dạng hiệu quả khi màu sắc được tính toán ở nơi khác và đã ở dạng được lưu trữ.

Bỏ qua đối số color sẽ vẽ màu trắng. Mặc định đó tiện lợi cho công việc thang xám, nơi màu trắng là giá trị tối đa và dễ đọc trên hầu hết các nền. Đối với các lớp phủ gỡ lỗi RGB565, nó hầu như luôn sai: màu xanh lá hoặc đỏ thường dễ đọc hơn trên loại cảnh mà camera thực sự nhìn thấy, và một màu sắc rõ ràng truyền đạt ý định.

5.6.3. Độ dày và tô màu đặc

Hầu hết các phương thức hình học nhận hai cờ quyết định cách dấu được vẽ:

  • thickness=N đặt độ rộng đường kẻ tính bằng điểm ảnh. Mặc định là 1, phù hợp với hầu hết các lớp phủ; giá trị lớn hơn hữu ích khi chú thích phải vẫn nhìn thấy được trên một cảnh bận rộn hoặc sau khi một giai đoạn tiếp theo của pipeline chỉnh sửa thêm ảnh.

  • fill=True chuyển dấu từ đường viền sang dạng đặc, tô màu đã chọn cho mỗi điểm ảnh bên trong. Mặc định là False.

Các cờ này không áp dụng cho các phép vẽ không có phần bên trong để tô -- đường thẳng, dấu cộng, mũi tên, tứ giác -- nơi chỉ thickness có ý nghĩa.

5.6.4. Vẽ văn bản

draw_string() ghi các ký tự từ phông chữ bitmap 8x10 điểm ảnh tích hợp sẵn. xy là góc trên bên trái của ô ký tự đầu tiên, text là chuỗi cần vẽ, và color theo cùng quy ước như các phương thức hình học. Phông chữ bao gồm toàn bộ phạm vi ASCII có thể in được và không có căn lề -- mỗi ký tự chiếm cùng một ô rộng 8 điểm ảnh -- giúp dễ dàng định vị đầu ra.

img.draw_string(10, 10, "blobs: 3", color=(0, 255, 0))

Chuỗi có thể chứa ký tự xuống dòng (\n); mỗi ký tự xuống dòng di chuyển ký tự tiếp theo đến đầu dòng mới mười điểm ảnh bên dưới dòng trước. Đối số scale vẽ mỗi ký tự ở kích thước lớn hơn theo hệ số dấu phẩy động, và x_spacingy_spacing thêm phần đệm xung quanh mỗi ký tự. Một tập hợp nhỏ các cờ xoay / lật áp dụng cho toàn bộ chuỗi hoặc cho từng ký tự riêng lẻ -- đủ để trình bày văn bản theo một góc hoặc dọc theo cạnh không nằm ngang khi bố cục yêu cầu.

5.6.5. Xóa canvas

Một phương thức trong nhóm này không vẽ bất kỳ dấu cụ thể nào. Nó chỉ đặt lại mỗi điểm ảnh của ảnh về không:

  • clear() -- đặt không mọi điểm ảnh, tùy chọn giới hạn trong một ROI hoặc xác định phạm vi qua một mặt nạ.

clear() là câu trả lời đúng khi một ứng dụng đang hợp thành chú thích từ đầu mỗi khung hình -- bắt đầu với canvas đen, vẽ các chú thích mới, đưa kết quả cho màn hình -- thay vì phủ lên khung hình đã chụp. Đây cũng là cách rẻ nhất để chuẩn bị ảnh tạm dùng làm bộ đệm mặt nạ.

Một ảnh mới được cấp phát đã là không từ hàm tạo, vì vậy clear() đặc biệt quan trọng cho các bộ đệm được tái sử dụng giữa các khung hình.