5.29. Mã vạch và mã Data Matrix¶
Hai nhóm mã khác bổ sung cho các bộ giải mã của camera. Mã vạch một chiều -- các vạch trên mặt hộp ngũ cốc, vòng đeo tay bệnh viện, nhãn vận chuyển -- là các ký hiệu có thể đọc được bằng máy cổ nhất vẫn còn sử dụng hàng ngày. Mã Data Matrix là hai chiều giống như mã QR, nhưng dày đặc hơn ở cùng kích thước nội dung và hướng tới việc đánh dấu công nghiệp -- dấu hiệu của nhà sản xuất được khắc laser lên bảng mạch hơn là áp phích trên tường. Module image có một bộ giải mã chuyên dụng cho mỗi loại, bao gồm các ứng dụng công nghiệp, bán lẻ và kiểm kê mà các mã 2D tiêu dùng chưa hoàn toàn đáp ứng được.
5.29.1. Mã vạch 1D¶
Mã vạch một chiều mã hóa nội dung của nó dưới dạng một chuỗi các vạch dọc có độ rộng khác nhau, đọc từ trái sang phải (hoặc từ trên xuống dưới cho các mã có hướng dọc). Các độ rộng được lượng tử hóa thành một trong một tập nhỏ các giá trị, và chuỗi các độ rộng này đánh vần các ký tự theo bất kỳ ký hiệu học nào mà máy in đã chọn: số cho mã sản phẩm UPC, chữ số cho số bộ phận kho hàng, hoặc văn bản tùy ý cho nhãn Code 128.
find_barcodes() quét khung hình để tìm mã vạch 1D theo bất kỳ ký hiệu học nào được hỗ trợ và trả về danh sách các đối tượng kết quả BarCode:
codes = img.find_barcodes()
for c in codes:
img.draw_rectangle(c.rect, color=(0, 255, 0))
print(c.payload, c.type, c.quality)
Bộ giải mã quét cả theo chiều ngang và chiều dọc trên khung hình trong một lần gọi, do đó mã vạch được in ở bất kỳ góc nào cũng được tìm thấy trong một lần quét mà ứng dụng không cần phải xoay đầu vào. roi giới hạn phạm vi tìm kiếm; không có tham số tinh chỉnh nào khác -- bộ giải mã là tự điều chỉnh.
Các ký hiệu học được hỗ trợ bao gồm các nhóm tiêu dùng và công nghiệp phổ biến. Nhóm bán lẻ là image.EAN2, image.EAN5, image.EAN8, image.UPCE, image.UPCA, image.EAN13 (các mã số có độ dài cố định trên hầu hết bao bì tiêu dùng), image.ISBN10 và image.ISBN13 (cùng nhóm được tái sử dụng cho sách). Nhóm đa năng là image.I25 (Interleaved 2 of 5, phổ biến trên nhãn vận chuyển), image.CODABAR (dùng trong thư viện và ngân hàng máu), image.CODE39, image.CODE93 và image.CODE128 (ký hiệu học chữ số có độ dài thay đổi cho văn bản tùy ý). Nhóm nhãn kệ hàng image.DATABAR (RSS-14) và image.DATABAR_EXP (RSS-Expanded) hoàn thiện danh sách.
Mỗi kết quả phát hiện mang theo từ vựng hộp giới hạn -- x, y, w, h, rect, corners -- và payload đã giải mã dưới dạng chuỗi. type là hằng số ký hiệu học từ danh sách trên, mà ứng dụng kiểm tra khi nó quan tâm cụ thể đến nhóm nào được giải mã (ví dụ: chỉ chấp nhận EAN13 cho ứng dụng quét hàng tạp hóa).
Hai trường quan trọng để lọc là rotation và quality. rotation là góc trong mặt phẳng ảnh của mã vạch tính bằng radian: bộ giải mã xử lý được các góc xoay tùy ý, nhưng mã xuôi chiều muốn hiển thị kết quả phát hiện gọn gàng có thể muốn lọc bỏ các mã trả về bị nghiêng quá một ngưỡng nhất định.
quality là số lần giải mã: số dòng quét đã giải mã thành công cùng một nội dung. Bộ giải mã chạy qua mỗi hàng (và cột) của khung hình giao với mã vạch, và tăng bộ đếm mỗi khi giải mã thành công. Mã vạch được in rõ nét và ánh sáng tốt cho ra quality ở mức hàng chục; mã vạch bị che khuất một phần hoặc bị mờ có thể chỉ giải mã được trên một hoặc hai dòng quét và báo cáo quality là 1 -- 2. Lọc bỏ các kết quả phát hiện dưới quality > 5 loại bỏ các giải mã lỗi thoáng qua của một dòng quét mà không ảnh hưởng đến các kết quả phát hiện thực sự.
Một ứng dụng mã vạch 1D rất đơn giản. Chụp một khung hình, gọi find_barcodes(), duyệt danh sách trả về, lọc theo c.type và c.quality, và chuyển tiếp c.payload qua UART hoặc USB đến bất kỳ giai đoạn tiếp theo nào đang ghi nhật ký hoặc tính tiền lần quét.
5.29.2. Data Matrix¶
Mã Data Matrix là một ký hiệu 2D mã hóa nội dung của nó dưới dạng lưới các ô đen và trắng, giống như cách mã QR làm. Nó khác với mã QR ở hai điểm thực tế: nó nhỏ hơn ở cùng kích thước nội dung (mã hóa dày đặc hơn) và hướng tới sử dụng công nghiệp hơn là tiêu dùng (nơi mã QR chiếm ưu thế). Các hoa văn được khắc laser vào các bộ phận kim loại trên sàn nhà máy, nhãn được in trên các gói vi mạch, các dấu đặt trên ống tiêm y tế -- tất cả những thứ đó thường là Data Matrix, không phải mã QR.
find_datamatrices() quét khung hình để tìm mã Data Matrix và trả về danh sách các đối tượng kết quả DataMatrix:
codes = img.find_datamatrices()
for c in codes:
img.draw_rectangle(c.rect, color=(0, 255, 0))
print(c.payload, c.rows, c.columns)
roi giới hạn phạm vi tìm kiếm theo cách thông thường. Nút tinh chỉnh duy nhất của bộ giải mã là effort, một số nguyên kiểm soát mức độ bộ giải mã cố gắng tìm kết quả khớp. Giá trị cao hơn cải thiện khả năng phát hiện mã mờ, hỏng hoặc nghiêng với cái giá là tốc độ khung hình; giá trị thấp hơn chạy nhanh hơn nhưng có thể bỏ lỡ các mã mà mức độ cố gắng cao hơn sẽ tìm thấy. Các giá trị dưới khoảng 160 thực tế không phát hiện được; các giá trị trên khoảng 240 mang lại hiệu quả giảm dần. Giá trị mặc định 200 là sự cân bằng hợp lý cho một ảnh rõ ràng, và điểm khởi đầu đúng cho một ứng dụng mới là mặc định cộng hoặc trừ 20 tùy thuộc vào việc mục tiêu có sạch (thấp hơn) hay bị hư hỏng (cao hơn).
Mỗi kết quả phát hiện mang theo từ vựng hộp giới hạn và bốn góc được phát hiện, payload đã giải mã, và rotation trong mặt phẳng ảnh tính bằng radian. Siêu dữ liệu bố cục mô tả kích thước và mật độ của ký hiệu mà bộ giải mã đã đọc: rows và columns là số lượng ô của lưới dữ liệu; capacity là số ký tự nội dung tối đa mà ký hiệu có thể chứa ở kích thước đó; padding là số lượng các vị trí đó không được sử dụng (capacity - len(payload)).
Các trường bố cục hữu ích cho các ứng dụng cần xác thực định dạng của một dấu khắc thay vì nội dung của nó. Một hệ thống theo dõi bộ phận có thể yêu cầu tất cả các dấu phải là mã 12x12 với tối đa hai ký tự đệm; một kết quả phát hiện trả về ở dạng 8x8 (ký hiệu nhỏ hơn so với thông số kỹ thuật yêu cầu) hoặc với 10 ký tự đệm (hầu như trống) được gắn cờ để đánh dấu lại.
5.29.3. Khi nào chọn loại nào¶
Trong khi QR so với AprilTag phụ thuộc vào loại nội dung (dữ liệu tùy ý so với ID nhỏ), mã vạch so với mã Data Matrix phụ thuộc vào mật độ vật lý và ngành công nghiệp.
Khi ứng dụng hướng đến người tiêu dùng và các mã đã tồn tại trong thực tế -- hàng tạp hóa, sách, nhãn vận chuyển, sách thư viện -- bộ phát hiện đúng là find_barcodes(). Các mã mà ứng dụng đang đọc đã được in cho một hệ thống khác đọc, và các ký hiệu học bán lẻ chuẩn hóa là thứ hệ thống đó mong đợi.
Khi ứng dụng là công nghiệp và các mã đang được in cho ứng dụng -- theo dõi kiểm kê trên sàn nhà máy, mã lô được khắc lên các bộ phận, dấu truy xuất nguồn gốc trên thiết bị y tế -- bộ phát hiện đúng là find_datamatrices() hoặc find_qrcodes(), tùy thuộc vào việc ứng dụng cần mật độ cao hơn của Data Matrix hay hỗ trợ công cụ rộng hơn của QR.
Một số ít ứng dụng kết hợp cả bốn bộ phát hiện trong một đường ống. Một camera kiểm tra gói hàng có thể chạy lần find_barcodes() cho UPC được in, lần find_qrcodes() cho mã QR vận chuyển trên cùng hộp đó, và lần find_datamatrices() cho mã bộ phận được khắc, tất cả trên cùng một khung hình đã chụp; ba danh sách kết quả được tương quan theo vị trí hộp giới hạn và được báo cáo như một bản ghi phát hiện duy nhất. Chi phí của mỗi bộ phát hiện cộng lại, vì vậy các ứng dụng làm điều này thường thu hẹp mỗi lần quét với một roi thích hợp thay vì tìm kiếm toàn bộ khung hình cho mọi loại mã.