5.6. Alakzatok és szöveg rajzolása

Egy algoritmusnak, amely valamit eldönt egy képről, gyakran láthatóvá kell tennie ezt a döntést. Egy foltdetektor megtalál egy területet, amely az alkalmazás számára fontos; az alkalmazás azt szeretné, ha a terület a képkockára lenne rajzolva, hogy egy kezelő – vagy a szkriptet futtató fejlesztő – láthassa, mit talált. Egy koordináta-transzformáció egy bemeneti pozíciót egy kimenetire képez le; ennek hibakeresése általában a két pozíció megjelölését jelenti ugyanazon a képen. Az IDE előnézete azt olvassa be, ami éppen a képkocka-pufferben van a lekérdezés pillanatában, így az algoritmus kimenetének láthatóvá tételének legegyszerűbb módja, ha magába a képkocka-pufferbe írunk feliratokat. A Image osztály rajzolási családja pontosan ehhez a munkához nyújt eszköztárat.

5.6.1. A primitívek

Minden rajzolási metódus egy adott fajta jelet helyez el a képen. A katalógus kicsi, és közel marad azokhoz a geometriai primitívekhez, amelyekre egy feliratozásnak valójában szüksége van:

  • draw_line() – egyenes vonalszakasz két végpont között.

  • draw_rectangle() – tengelyekkel párhuzamos téglalap, üres vagy kitöltött.

  • draw_circle() – kör egy középpont körül, üres vagy kitöltött.

  • draw_ellipse() – tetszőleges elforgatású ellipszis.

  • draw_cross() – pluszjel egy pontnál, a szokásos jelölés egy súlypont vagy egy kattintási célpont számára.

  • draw_arrow() – nyíl egy kezdőponttól egy végpontig.

  • draw_edges() – egy tetszőleges négyszög négy oldala, a négy sarokpont megadásával; a természetes mód egy észlelt kód vagy egy perspektivikusan torzított terület körvonalazására.

  • draw_string() – szöveg egy beépített bitmap betűtípusból.

Mindegyik helyben módosítja a forrásképet, és láncoláshoz ugyanazt a képet adja vissza, a korábban kialakított operáló-metódus konvenciót követve.

A grid of small panels showing each of the eight drawing primitives applied once. Each panel contains a line, a rectangle, a circle, an ellipse, a cross, an arrow, a quadrilateral, or a short text string, with the name of the method that produced it labelled underneath.

A nyolc rajzolási primitív, panelenként egy. Minden metódus egyfajta jelet készít.

5.6.2. Szín

Minden rajzolási metódus egy color argumentumot vár, amely eldönti, milyen értéket írjon minden megfestett képpontba. Az argumentum formája a kép formátumától függ. Egy RGB565 kép esetén a természetes forma egy (r, g, b) rendezett hármas, ahol minden csatorna 0255 között van; a modul ezt a 16 bites RGB565 szóba csomagolja, mielőtt kiírná. Egy szürkeárnyalatos kép esetén a természetes forma egyetlen egész fényerő-érték 0 (fekete) és 255 (fehér) között. A metódusok a formátum nyers tárolt értékét is elfogadják – egy 16 bites csomagolt szót RGB565 esetén, egy 8 bites egészt szürkeárnyalatos esetén –, ami a hatékony forma, amikor a színt máshol számították ki, és az már a tárolt formában van.

A color argumentum elhagyása fehérrel fest. Ez az alapértelmezés kényelmes szürkeárnyalatos munkához, ahol a fehér a maximális érték, és a legtöbb háttér ellen tisztán látszik. RGB565 hibakeresési rávetítésekhez szinte mindig helytelen: a zöld vagy a piros általában jobban látszik az olyan jelenet ellen, amelyet egy kamera valójában lát, és egy kifejezett szín közvetíti a szándékot.

5.6.3. Vastagság és kitöltés

A legtöbb geometriai metódus két jelzőt vár, amelyek eldöntik, hogyan rajzolódik a jel:

  • A thickness=N állítja be a vonalvastagságot képpontokban. Az alapértelmezés 1, ami a legtöbb rávetítéshez megfelelő; egy nagyobb érték akkor hasznos, ha egy feliratnak láthatónak kell maradnia egy zsúfolt jelenet ellen, vagy miután a folyamat egy következő szakasza tovább módosítja a képet.

  • A fill=True körvonalból tömör jellé alakítja a jelet, minden belső képpontot a választott színnel megfestve. Az alapértelmezés False.

Ezek a jelzők nem vonatkoznak azokra a primitívekre, amelyeknek nincs kitölthető belsejük – a vonal, a kereszt, a nyíl, a négyszög –, ahol csak a thickness értelmes.

5.6.4. Szöveg rajzolása

A draw_string() karaktereket ír ki egy beépített 8x10 képpontos bitmap betűtípusból. Az x és az y az első karakter cellájának bal felső sarka, a text a rajzolandó karakterlánc, a color pedig ugyanazt a konvenciót követi, mint a geometriai metódusok. A betűtípus a teljes nyomtatható ASCII tartományt hordozza, és nincs alávágása (kerning) – minden karakter ugyanazt a 8 képpont széles cellát foglalja el –, ami megkönnyíti a kimenet pozicionálását.

img.draw_string(10, 10, "blobs: 3", color=(0, 255, 0))

A karakterlánc tartalmazhat újsorokat (\n); minden újsor a következő karaktert egy új sor elejére mozgatja, tíz képponttal az előző alatt. A scale argumentum minden karaktert egy lebegőpontos szorzóval nagyobb méretben rajzol, az x_spacing és az y_spacing pedig kitöltést ad minden karakter köré. Forgatási / tükrözési / átfordítási jelzők egy kis halmaza vagy az egész karakterláncra, vagy önállóan minden egyes karakterre alkalmazható – elegendő szabályozás ahhoz, hogy a szöveget egy szög mentén vagy egy nem vízszintes él ellen igazítsuk, ha az elrendezés ezt kívánja.

5.6.5. A vászon törlése

A család egyik metódusa nem rajzol semmilyen konkrét jelet. Csupán a kép minden képpontját nullára állítja vissza:

  • clear() – minden képpontot nulláz, opcionálisan egy ROI-ra korlátozva vagy egy maszkon keresztül hatókörözve.

A clear() a helyes válasz, amikor egy alkalmazás minden képkockánál a nulláról állít össze egy feliratot – kezdés egy fekete vászonnal, az új feliratok rajzolása, majd az eredmény átadása a kijelzőnek –, ahelyett hogy a rögzített képkockára rávetítene. Ez egyúttal a legolcsóbb mód egy ideiglenes kép előkészítésére maszkpufferként való használathoz.

Egy frissen lefoglalt kép a konstruktor révén már nulla, így a clear() kifejezetten a képkockák között újrafelhasznált pufferek esetén számít.