5.29. Barcode dan kode Data Matrix¶
Dua kelompok kode lagi melengkapi dekoder kamera. Barcode satu dimensi -- garis-garis pada sisi kotak sereal, gelang tangan rumah sakit, label pengiriman -- adalah simbol yang dapat dibaca mesin tertua yang masih digunakan sehari-hari. Kode Data Matrix bersifat dua dimensi seperti kode QR, tetapi lebih padat pada ukuran payload yang sama dan ditujukan untuk penandaan industri -- tanda pembuat yang diukir dengan laser pada papan sirkuit daripada poster di dinding. Modul image memiliki dekoder khusus untuk masing-masing, yang mencakup aplikasi industri, ritel, dan inventaris yang tidak pernah sepenuhnya dicapai oleh kode 2D konsumen.
5.29.1. Barcode 1D¶
Sebuah barcode satu dimensi mengkodekan payloadnya sebagai urutan batang vertikal dengan lebar yang bervariasi, dibaca dari kiri ke kanan (atau dari atas ke bawah untuk kode yang berorientasi vertikal). Lebar-lebar tersebut dikuantisasi ke salah satu dari sekumpulan kecil nilai, dan urutan lebar-lebar tersebut mengeja karakter-karakter dalam simbologi apa pun yang dipilih printer: numerik untuk kode produk UPC, alfanumerik untuk nomor suku cadang gudang, atau teks sewenang-wenang untuk label Code 128.
find_barcodes() memindai bingkai untuk barcode 1D dalam simbologi yang didukung apa pun dan mengembalikan daftar objek hasil 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)
Dekoder memindai secara horizontal dan vertikal di seluruh bingkai dalam satu panggilan, sehingga barcode yang dicetak pada sudut apa pun ditemukan dalam satu kali jalan tanpa aplikasi harus memutar input. roi membatasi pencarian; tidak ada parameter penyetelan lain -- dekoder bersifat mandiri.
Simbologi yang didukung mencakup keluarga konsumen dan industri yang umum. Set ritel adalah image.EAN2, image.EAN5, image.EAN8, image.UPCE, image.UPCA, image.EAN13 (kode panjang tetap numerik pada sebagian besar kemasan konsumen), image.ISBN10, dan image.ISBN13 (keluarga yang sama yang digunakan kembali untuk buku). Set tujuan umum adalah image.I25 (Interleaved 2 of 5, umum pada label pengiriman), image.CODABAR (digunakan di perpustakaan dan bank darah), image.CODE39, image.CODE93, dan image.CODE128 (simbologi alfanumerik panjang variabel untuk teks sewenang-wenang). Keluarga tepi rak image.DATABAR (RSS-14) dan image.DATABAR_EXP (RSS-Expanded) melengkapi daftar ini.
Setiap deteksi membawa kosakata kotak pembatas -- x, y, w, h, rect, corners -- dan payload yang telah didekode sebagai sebuah string. type adalah konstanta simbologi dari daftar di atas, yang diperiksa aplikasi ketika secara khusus peduli tentang keluarga mana yang didekode (misalnya menerima hanya EAN13 untuk aplikasi pemindai bahan makanan).
Dua bidang yang penting untuk penyaringan adalah rotation dan quality. rotation adalah sudut barcode di bidang-citra dalam radian: dekoder mengatasi rotasi sewenang-wenang, tetapi kode hilir yang ingin menampilkan deteksi dengan bersih mungkin ingin menyaring kode yang dikembalikan miring melampaui beberapa ambang batas.
quality adalah jumlah dekode: jumlah baris pindai yang berhasil mendekode payload yang sama. Dekoder berjalan di setiap baris (dan kolom) bingkai yang berpotongan dengan barcode, dan menginkremen penghitung setiap kali dekode berhasil. Barcode tercetak dalam fokus tajam dan pencahayaan baik menghasilkan quality dalam puluhan; barcode yang sebagian tertutup atau kotor mungkin hanya terdekode pada satu atau dua baris pindai dan melaporkan quality 1 -- 2. Menyaring deteksi di bawah quality > 5 membuang mis-dekode satu-baris pindai yang sementara tanpa biaya untuk deteksi yang asli.
Aplikasi barcode 1D itu kecil. Ambil sebuah bingkai, panggil find_barcodes(), iterasi daftar yang dikembalikan, filter pada c.type dan c.quality, dan teruskan c.payload melalui UART atau USB ke tahap hilir mana pun yang mencatat atau memroses pemindaian.
5.29.2. Data Matrix¶
Kode Data Matrix adalah simbol 2D yang mengkodekan payloadnya sebagai kisi sel hitam dan putih, seperti yang dilakukan kode QR. Ini berbeda dari kode QR dalam dua hal praktis: lebih kecil pada ukuran payload yang sama (pengkodeannya lebih padat) dan ditargetkan untuk penggunaan industri daripada konsumen (di mana kode QR mendominasi). Pola yang diukir dengan laser ke dalam bagian logam di lantai pabrik, label yang dicetak pada paket sirkuit terpadu, tanda yang ditempatkan pada jarum suntik medis -- semuanya biasanya adalah Data Matrices, bukan kode QR.
find_datamatrices() memindai bingkai untuk kode Data Matrix dan mengembalikan daftar objek hasil 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 membatasi pencarian dengan cara biasa. Satu tombol penyetelan spesifik dekoder adalah effort, bilangan bulat yang mengontrol seberapa keras dekoder bekerja untuk menemukan kecocokan. Nilai yang lebih tinggi meningkatkan deteksi kode yang redup, rusak, atau miring dengan biaya kecepatan bingkai; nilai yang lebih rendah berjalan lebih cepat tetapi mungkin melewatkan kode yang akan ditemukan oleh upaya yang lebih tinggi. Nilai di bawah sekitar 160 secara efektif gagal mendeteksi; nilai di atas sekitar 240 memberikan hasil yang semakin berkurang. Default 200 adalah keseimbangan yang masuk akal untuk citra yang jelas, dan titik awal yang tepat untuk aplikasi baru adalah default plus atau minus 20 tergantung pada apakah targetnya bersih (lebih rendah) atau rusak (lebih tinggi).
Setiap deteksi membawa kosakata kotak pembatas dan empat sudut yang terdeteksi, payload yang telah didekode, dan rotation di bidang-citra dalam radian. Metadata tata letak menggambarkan ukuran dan kepadatan simbol yang dibaca dekoder: rows dan columns adalah jumlah sel dari kisi data; capacity adalah jumlah maksimum karakter payload yang dapat dibawa simbol pada ukuran tersebut; padding adalah berapa banyak slot tersebut yang tidak digunakan (capacity - len(payload)).
Bidang tata letak berguna untuk aplikasi yang perlu memvalidasi format dari tanda yang diukir daripada isinya. Sistem pelacak bagian mungkin mengharuskan semua tanda adalah kode 12-kali-12 dengan paling banyak dua karakter padding; deteksi yang kembali pada 8-kali-8 (simbol yang lebih kecil dari yang ditentukan spesifikasi) atau dengan 10 karakter padding (sebagian besar kosong) ditandai untuk penandaan ulang.
5.29.3. Kapan memilih yang mana¶
Di mana perbandingan QR versus AprilTag bergantung pada jenis payload (data sewenang-wenang versus ID kecil), barcode versus kode Data Matrix bergantung pada kepadatan fisik dan industri.
Ketika aplikasi berhadapan dengan konsumen dan kode sudah ada di lapangan -- bahan makanan, buku, label pengiriman, buku perpustakaan -- dekoder yang tepat adalah find_barcodes(). Kode yang dibaca aplikasi dicetak untuk dibaca oleh sistem lain, dan simbologi ritel yang terstandarisasi adalah yang diharapkan sistem tersebut.
Ketika aplikasi bersifat industri dan kode sedang dicetak untuk aplikasi -- pelacakan inventaris di lantai pabrik, kode lot yang diukir pada bagian, tanda keterlacakan pada perangkat medis -- dekoder yang tepat adalah find_datamatrices() atau find_qrcodes(), tergantung pada apakah aplikasi membutuhkan kepadatan lebih tinggi dari Data Matrix atau dukungan perkakas yang lebih luas dari QR.
Sejumlah kecil aplikasi mencampur keempat dekoder dalam satu pipeline. Kamera inspeksi paket mungkin menjalankan satu kali find_barcodes() untuk UPC yang tercetak, satu kali find_qrcodes() untuk kode QR pengiriman pada kotak yang sama, dan satu kali find_datamatrices() untuk kode bagian yang diukir, semuanya pada bingkai yang sama yang diambil; tiga daftar hasil dikorelasikan berdasarkan posisi kotak pembatas dan dilaporkan sebagai satu catatan deteksi. Biaya setiap dekoder bertambah, sehingga aplikasi yang melakukan ini biasanya mempersempit setiap kali jalan dengan roi yang sesuai daripada mencari seluruh bingkai untuk setiap jenis kode.