5.6. Şekil ve metin çizme¶
Bir görüntü hakkında bir karar veren algoritmanın çoğu zaman o kararın görünür olmasına ihtiyacı vardır. Bir nokta (blob) dedektörü, uygulamanın önemsediği bir bölge bulur; uygulama, bir operatörün – ya da betiği çalıştıran geliştiricinin – neyin bulunduğunu görebilmesi için o bölgenin çerçeveye çizilmesini ister. Bir koordinat dönüşümü, bir giriş konumunu bir çıkış konumuna eşler; bunu ayıklamak genellikle iki konumu aynı görüntü üzerinde işaretlemek anlamına gelir. IDE önizlemesi, sorguladığı anda çerçeve arabelleğinde (frame buffer) ne varsa onu okur, bu yüzden algoritma çıktısını görünür kılmanın en basit yolu, açıklamaları doğrudan çerçeve arabelleğinin (frame buffer) içine yazmaktır. Image sınıfındaki çizim ailesi, tam da bu iş için araç takımıdır.
5.6.1. İlkeller¶
Her çizim yöntemi, görüntüye belirli türde bir işaret yerleştirir. Katalog küçüktür ve bir açıklamanın gerçekte ihtiyaç duyduğu geometrik ilkellere yakın durur:
draw_line()– iki uç nokta arasında düz bir çizgi parçası.draw_rectangle()– eksene hizalı bir dikdörtgen, içi boş veya dolu.draw_circle()– bir merkez etrafında bir daire, içi boş veya dolu.draw_ellipse()– keyfi dönüşe sahip bir elips.draw_cross()– bir noktada artı işareti, bir ağırlık merkezi veya tıklama hedefi için olağan işaret.draw_arrow()– bir başlangıç noktasından bir bitiş noktasına bir ok.draw_edges()– dört köşe noktası verildiğinde, keyfi bir dörtgenin dört kenarı; tespit edilen bir etiketi veya perspektif olarak çarpıtılmış bir bölgeyi çevrelemenin doğal yolu.draw_string()– yerleşik bir bit eşlem (bitmap) yazı tipinden metin.
Bunların her biri kaynak görüntüyü yerinde değiştirir ve zincirleme için aynı görüntüyü döndürür; daha önce belirlenen işlem yöntemi kuralını izler.
Sekiz çizim ilkeli, panel başına bir tane. Her yöntem bir tür işaret yapar.¶
5.6.2. Renk¶
Her çizim yöntemi, boyanan her piksele hangi değerin yazılacağına karar veren bir color argümanı alır. Bu argümanın aldığı biçim, görüntünün formatına bağlıdır. Bir RGB565 görüntü için doğal biçim, her kanalı 0 – 255 aralığında olan bir (r, g, b) demetidir; modül bunu yazmadan önce 16 bitlik RGB565 sözcüğüne paketler. Bir gri tonlama görüntü için doğal biçim, 0 (siyah) ile 255 (beyaz) arasında tek bir tam sayı parlaklık değeridir. Yöntemler, formatın ham depolanmış değerini de kabul eder – RGB565 için 16 bitlik paketlenmiş bir sözcük, gri tonlama için 8 bitlik bir tam sayı – ki bu, renk başka bir yerde hesaplandığında ve zaten depolanmış biçimde olduğunda verimli olan biçimdir.
color argümanını atlamak beyazı boyar. Bu varsayılan, beyazın maksimum değer olduğu ve çoğu arka plana karşı net okunduğu gri tonlama işleri için kullanışlıdır. RGB565 ayıklama bindirmeleri için ise neredeyse her zaman yanlıştır: bir kameranın gerçekte gördüğü türden bir sahneye karşı genellikle yeşil veya kırmızı daha iyi okunur ve açık bir renk niyeti iletir.
5.6.3. Kalınlık ve dolgu¶
Geometrik yöntemlerin çoğu, işaretin nasıl çizileceğine karar veren iki bayrak alır:
thickness=N, çizgi genişliğini piksel cinsinden ayarlar. Varsayılan değer1‘dir ve bu, çoğu bindirme için yeterlidir; bir açıklamanın yoğun bir sahneye karşı veya sonraki bir ardışık düzen aşaması görüntüyü daha da değiştirdikten sonra görünür kalması gerektiğinde daha büyük bir değer kullanışlıdır.fill=True, işareti bir ana hattan, her iç pikseli seçilen renkle boyayan dolu bir işarete dönüştürür. Varsayılan değerFalse‘tur.
Bu bayraklar, doldurulacak bir iç kısmı olmayan ilkellere uygulanmaz – çizgi, artı, ok, dörtgen – ki bunlarda yalnızca thickness anlamlıdır.
5.6.4. Metin çizme¶
draw_string(), yerleşik bir 8’e 10 piksellik bit eşlem (bitmap) yazı tipinden karakterler yazar. x ve y, ilk karakterin hücresinin sol üst köşesidir, text çizilecek dizedir ve color geometrik yöntemlerle aynı kuralı izler. Yazı tipi, yazdırılabilir tüm ASCII aralığını taşır ve hiç kerning içermez – her karakter aynı 8 piksel genişliğindeki hücreyi kaplar – bu da çıktıyı konumlandırmayı kolaylaştırır.
img.draw_string(10, 10, "blobs: 3", color=(0, 255, 0))
Dize satır sonları (\n) içerebilir; her satır sonu, sonraki karakteri bir öncekinin on piksel altındaki yeni bir satırın başına taşır. scale argümanı her karakteri kayan noktalı bir çarpanla daha büyük bir boyutta çizer ve x_spacing ile y_spacing her karakterin etrafına dolgu ekler. Küçük bir döndürme / yansıtma / çevirme bayrakları kümesi, ya tüm dizeye ya da her karaktere ayrı ayrı uygulanır – düzen gerektirdiğinde metni bir açı boyunca veya yatay olmayan bir kenara karşı yerleştirmek için yeterli kontrol sağlar.
5.6.5. Tuvali temizleme¶
Ailedeki bir yöntem belirli bir işaret çizmez. Yalnızca görüntünün her pikselini sıfıra sıfırlar:
clear()– her pikseli sıfırlar, isteğe bağlı olarak bir ROI ile sınırlandırılır veya bir maske aracılığıyla kapsamlandırılır.
clear(), bir uygulama her çerçevede bir açıklamayı sıfırdan oluşturduğunda doğru cevaptır – siyah bir tuvalle başla, yeni açıklamaları çiz, sonucu ekrana teslim et – yakalanan çerçevenin üzerine bindirme yapmak yerine. Ayrıca, bir maske arabelleği olarak kullanılacak geçici bir görüntü hazırlamanın en ucuz yoludur.
Yeni ayrılmış bir görüntü, oluşturucudan zaten sıfırdır, bu yüzden clear() özellikle çerçeveler arasında yeniden kullanılan arabellekler için önemlidir.