Hướng dẫn dùng cv2.line python
Vẽ trong OpenCVTrực quan hóa kết quả xử lý ảnh cũng quan trọng như cách ăn diện của bạn hàng ngày vậy. Vẽ vời đẹp, chuyên nghiệp sẽ gây ấn tượng cho người xem. Nay Minh sẽ viết một số hàm vẽ cơ bản lên ảnh dùng thư viện OpenCV. Mình sẽ cố gắng code tổng quát nhất có thể để bạn có thể copy code và sử dụng ngay vào dự án của mình mà ít phải chỉnh sửa tham số. Cụ thể mình sẽ gói (wrap) các hàm vẽ lại để nó vẽ đường nét đậm nhạt tương đối theo kích thước ảnh. Điều này cực kỳ tốt khi bạn đang làm dự án Xử Lý Ảnh, Học Máy (machine learning) để xử lý nhiều ảnh với kích thước / độ phân giải đa dạng; và ta sẽ phải visualize kết quả lên trên các ảnh này. OK, let's go, chiến thôi! Show Việc đầu tiên và trên hết "xẩy" đó là lấy một ảnh mẫu làm "tài liệu tham khảo" nào. Tui đã chuẩn bị sẵn cho các ông :">. Mình thích thì mình "tha thu" lên ảnh thôi :v. girl.jpg Ghi chữ lên ảnhTrong OpenCV để ghi chữ lên ảnh, bạn sẽ dùng hàm cv2.putText. Hàm này sẽ ghi chữ trực tiếp lên ảnh, do đó nó sẽ chỉnh sửa trực tiếp trên ảnh gốc. Nếu muốn giữ ma trận ảnh gốc chưa vẽ, ta cần phải sao chép (copy / clone) ra. Một số tham số cho hàm putText:
Minh đã cá nhân hóa này thành một hàm draw_text() cho phép đặc tả size ảnh tương đối theo kích thước ảnh, nó sẽ ước lượng tính toán tự động fontScale phù hợp để chữ to bằng size % so với cạnh ngắn của ảnh. Điểm lợi của cách làm này đó là với ảnh độ phân giải cao chữ cũng sẽ "to" ra tương ứng, hoặc "nhỏ" lại một cách tương dối theo kích thước / độ phân giải ảnh. Tránh việc "tuning" giá trị fontScale, thickness khi xử lý nhiều loại ảnh khác nhau. Set thickness bằng zero (0) vào hàm draw_text() của mình để nó tự tính độ đậm thickness phù hợp với kích thước chữ. Tọa độ chữ mình sẽ nhận vô giá trị 0-1 tương đối so với kích thước ảnh. Cách sử dụng được minh họa trong đoạn code bên dưới:
draw_text.py
Kết quả "tha thu" chữ của chúng ta: girl_text.jpg: chữ "Hi em" size 5%, chữ "Good afternoon" size 3%. Ae muốn chữ to / nhỏ thì điều chỉnh size tương ứng nhé :). Vẽ đường thẳngÔng nào vẽ đường thẳng dùng thư viện của OpenCV thì tham khảo hàm cv2.line(). Minh đã wrap hàm đó lại thành draw_line() như hiện thực bên dưới. Các tọa độ x, y đơn vị theo % (giá trị từ 0-1), điều chỉnh độ dày của đường thẳng theo tham số size; Minh đang để size mặc định 1% thấy cũng tạm ổn ^^. Size 1% nghĩa là mình sẽ tính thickness bằng 1% chiều ngắn của ảnh. Giả sử ảnh độ phân giải là 640x480 => cạnh ngắn sẽ là 480px => 1% của 480px sẽ là 4.8px => thickness = int(4.8) = 4. draw_line.py
Kết quả "tha thu" đoạn thẳng: girl_line.jpg: line vàng size 0.5%, line đỏ size 1%. Vẽ mũi tênTài liệu hàm cv2.arrowedLine(), các ông tự xem nha. Lười giải thích wé :D. Bên dưới là code mình wrap lại draw_arrow() cách dùng tương tự draw_line(). Tip Length nghĩa là phần mũi tên chiếm bao nhiêu % so với chiều dài line. Các giá trị mặc định trong hàm draw_arrow() mình thấy cũng đẹp ùi. Các ông cứ tùy chỉnh nhé :D. draw_arrow.py
Vẽ hình chữ nhậtVẽ hình chữ nhật trong OpenCV ta dùng hàm cv2.rectangle(). Mình cũng đã customize lại thành hàm draw_rect(), điều chỉnh độ đậm nhạt của hình chữ nhật bằng tham số size. Nếu size set giá trị <= 0, hàm của mình vẽ hình chữ nhật đặc ruột nha. Vẽ hình chữ nhật (hay còn gọi là vẽ box) thường được dùng để trực quan hóa kết quả phát hiện đối tượng trong bài toán object detection. Các đối tượng thường được phát hiện và khoanh vùng theo hình chữ nhật. draw_rect.py
Vẽ hình trònVẽ hình tròn trong OpenCV ta dùng hàm cv2.circle(). Đặc tả hàm draw_circle():
draw_circle.py
Vẽ ellipseVẽ ellipse trong OpenCV ta dùng hàm cv2.ellipse(). Đặc tả hàm draw_ellipse(), hàm này Minh chỉ điều chỉnh nhẹ chỗ tọa độ center lấy theo % và nét đậm của đường ellipse theo tham số size:
draw_ellipse.py
Vẽ đa giácVẽ đường đa giác trong OpenCV ta dùng hàm cv2.polylines(). Minh đã gói gém hàm polylines lại thành hàm draw_poly() của mình. Một số lưu ý sử dụng:
draw_poly.py
Vậy là cũng đã kết thúc bài viết vẽ vời trong OpenCV lên ảnh rồi. Trực quan hóa thường nằm ở bước hậu xử lý để "visualize" kết quả dự đoán của giải thuật / mô hình của chúng ta. Bài viết tiếp theo: Tut 4.2: Xử lý ảnh - Pha trộn ảnh trong OpenCV (blending) Cảm ơn bạn đã theo dõi bài viết. Hãy kết nối với tớ nhé!
Khám phá xử lý ảnh - GVGroup Danh sách bài viết series OpenCV:
|