5.6. Menggambar bentuk dan teks¶
Algoritma yang mengambil keputusan tentang suatu citra sering kali perlu membuat keputusan tersebut terlihat. Detektor blob menemukan wilayah yang diminati aplikasi; aplikasi ingin wilayah tersebut digambar pada bingkai sehingga operator -- atau pengembang yang menjalankan skrip -- dapat melihat apa yang ditemukan. Transformasi koordinat memetakan posisi masukan ke posisi keluaran; debugging biasanya berarti menandai dua posisi pada citra yang sama. Pratinjau IDE membaca apa pun yang ada di buffer bingkai saat itu di-poll, sehingga cara paling sederhana untuk membuat keluaran algoritma terlihat adalah dengan menulis anotasi ke dalam buffer bingkai itu sendiri. Keluarga drawing pada kelas Image adalah toolkit yang tepat untuk pekerjaan tersebut.
5.6.1. Primitif¶
Setiap metode gambar menempatkan satu jenis tanda tertentu pada citra. Katalognya kecil dan tetap dekat dengan primitif geometris yang benar-benar dibutuhkan suatu anotasi:
draw_line()-- segmen garis lurus antara dua titik ujung.draw_rectangle()-- persegi panjang yang sejajar sumbu, berongga atau terisi.draw_circle()-- lingkaran di sekitar pusat, berongga atau terisi.draw_ellipse()-- elips dengan rotasi bebas.draw_cross()-- tanda plus di suatu titik, tanda lazim untuk centroid atau target klik.draw_arrow()-- panah dari titik awal ke titik akhir.draw_edges()-- empat sisi dari sebuah segiempat sembarang, diberikan empat titik sudut; cara alami untuk menggarisbawahi tag yang terdeteksi atau wilayah yang telah mengalami transformasi perspektif.draw_string()-- teks dari font bitmap bawaan.
Setiap metode ini memodifikasi citra sumber di tempat dan mengembalikan citra yang sama untuk chaining, mengikuti konvensi metode operasi yang ditetapkan sebelumnya.
Delapan primitif gambar, satu per panel. Setiap metode membuat satu jenis tanda.¶
5.6.2. Warna¶
Setiap metode gambar menerima argumen color yang menentukan nilai apa yang ditulis ke setiap piksel yang dilukis. Bentuk argumen tersebut tergantung pada format citra. Untuk citra RGB565, bentuk alaminya adalah tuple (r, g, b) dengan setiap saluran dalam 0 -- 255; modul mengemas itu menjadi kata RGB565 16-bit sebelum menulisnya. Untuk citra skala abu-abu, bentuk alaminya adalah satu bilangan bulat kecerahan dari 0 (hitam) hingga 255 (putih). Metode ini juga menerima nilai tersimpan mentah format -- kata 16-bit yang dikemas untuk RGB565, bilangan bulat 8-bit untuk skala abu-abu -- yang merupakan bentuk efisien ketika warna dihitung di tempat lain dan sudah dalam bentuk tersimpan.
Menghilangkan argumen color melukis dengan warna putih. Default itu nyaman untuk pekerjaan skala abu-abu, di mana putih adalah nilai maksimum dan terbaca jelas terhadap sebagian besar latar belakang. Untuk overlay debug RGB565 ini hampir selalu salah: hijau atau merah biasanya terbaca lebih baik terhadap jenis pemandangan yang benar-benar dilihat kamera, dan warna yang eksplisit mengomunikasikan maksud.
5.6.3. Ketebalan dan isian¶
Sebagian besar metode geometris menerima dua flag yang menentukan bagaimana tanda digambar:
thickness=Nmenetapkan lebar garis dalam piksel. Default-nya adalah1, yang tepat untuk sebagian besar overlay; nilai yang lebih besar berguna ketika suatu anotasi harus tetap terlihat terhadap pemandangan yang sibuk atau setelah tahap pipeline selanjutnya memodifikasi citra lebih lanjut.fill=Truemengubah tanda dari garis luar menjadi tanda solid, melukis setiap piksel interior dengan warna yang dipilih. Default-nya adalahFalse.
Flag ini tidak berlaku untuk primitif yang tidak memiliki interior untuk diisi -- garis, tanda silang, panah, segiempat -- di mana hanya thickness yang bermakna.
5.6.4. Menggambar teks¶
draw_string() menulis karakter dari font bitmap 8-kali-10-piksel bawaan. x dan y adalah sudut kiri atas sel karakter pertama, text adalah string yang akan digambar, dan color mengikuti konvensi yang sama dengan metode geometris. Font membawa rangkaian ASCII yang dapat dicetak lengkap dan tidak memiliki kerning -- setiap karakter menempati sel selebar 8 piksel yang sama -- sehingga keluaran mudah diposisikan.
img.draw_string(10, 10, "blobs: 3", color=(0, 255, 0))
String dapat menyertakan baris baru (\n); setiap baris baru memindahkan karakter berikutnya ke awal baris baru sepuluh piksel di bawah yang sebelumnya. Argumen scale menggambar setiap karakter pada ukuran yang lebih besar dengan faktor floating-point, dan x_spacing serta y_spacing menambahkan padding di sekitar setiap karakter. Sekumpulan kecil flag rotate / mirror / flip berlaku baik untuk seluruh string maupun untuk setiap karakter secara individual -- kontrol yang cukup untuk menyusun teks pada sudut tertentu atau terhadap tepi yang tidak horizontal ketika tata letak memerlukannya.
5.6.5. Menghapus kanvas¶
Satu metode dalam keluarga ini tidak menggambar tanda tertentu. Metode ini hanya mereset setiap piksel citra ke nol:
clear()-- nolkan setiap piksel, opsional dibatasi ke ROI atau dicakup melalui mask.
clear() adalah jawaban yang tepat ketika suatu aplikasi mengomposisikan anotasi dari awal setiap bingkai -- mulai dengan kanvas hitam, gambar anotasi baru, serahkan hasilnya ke tampilan -- daripada overlay di atas bingkai yang diambil. Ini juga cara paling murah untuk menyiapkan citra sementara untuk digunakan sebagai buffer mask.
Citra yang baru dialokasikan sudah bernilai nol dari konstruktor, sehingga clear() secara khusus penting untuk buffer yang digunakan kembali antar bingkai.