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.

Kis panelek rácsa, amelyek a nyolc rajzolási primitív mindegyikét egyszer alkalmazva mutatják be. Minden panel egy vonalat, egy téglalapot, egy kört, egy ellipszist, egy keresztet, egy nyilat, egy négyszöget vagy egy rövid szövegrészletet tartalmaz, alatta az azt előállító metódus nevével felcímkézve.

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.