5.6. Rita former och text¶
En algoritm som avgör något om en bild behöver ofta att det avgörandet är synligt. En blob-detektor hittar ett område som applikationen bryr sig om; applikationen vill att området ritas på bildrutan så att en operatör – eller utvecklaren som kör skriptet – kan se vad som hittades. En koordinattransformation mappar en inmatningsposition till en utmatningsposition; att felsöka den innebär oftast att markera de två positionerna på samma bild. Förhandsvisningen i IDE:n läser det som finns i bildbufferten i det ögonblick den pollar, så det enklaste sättet att göra algoritmens utdata synlig är att skriva annoteringar in i själva bildbufferten. Rit-familjen på klassen Image är verktygslådan för precis det arbetet.
5.6.1. Primitiverna¶
Varje ritmetod placerar ett specifikt slags märke på bilden. Katalogen är liten och håller sig nära de geometriska primitiver som en annotering faktiskt behöver:
draw_line()– ett rakt linjesegment mellan två ändpunkter.draw_rectangle()– en axelinriktad rektangel, ihålig eller fylld.draw_circle()– en cirkel runt en mittpunkt, ihålig eller fylld.draw_ellipse()– en ellips med godtycklig rotation.draw_cross()– ett plustecken vid en punkt, det vanliga märket för en tyngdpunkt eller ett klickmål.draw_arrow()– en pil från en startpunkt till en slutpunkt.draw_edges()– de fyra sidorna av en godtycklig fyrhörning, givet de fyra hörnpunkterna; det naturliga sättet att rita konturen av en detekterad tagg eller ett perspektivförvrängt område.draw_string()– text från ett inbyggt bitmappstypsnitt.
Var och en av dessa modifierar källbilden på plats och returnerar samma bild för kedjning, enligt den operationsmetodskonvention som etablerades tidigare.
De åtta ritprimitiverna, en per panel. Varje metod gör ett slags märke.¶
5.6.2. Färg¶
Varje ritmetod tar ett color-argument som avgör vilket värde som ska skrivas in i varje målad pixel. Vilken form det argumentet tar beror på bildens format. För en RGB565-bild är den naturliga formen en (r, g, b)-tupel med varje kanal i 0 – 255; modulen packar ner det till det 16-bitars RGB565-ordet innan det skrivs. För en gråskalebild är den naturliga formen ett enda heltal för ljusstyrka från 0 (svart) till 255 (vit). Metoderna accepterar också formatets råa lagrade värde – ett 16-bitars packat ord för RGB565, ett 8-bitars heltal för gråskala – vilket är den effektiva formen när färgen beräknades på annat håll och redan är i den lagrade formen.
Att utelämna color-argumentet målar vitt. Det standardvärdet är bekvämt för gråskalearbete, där vitt är det maximala värdet och avtecknar sig tydligt mot de flesta bakgrunder. För RGB565-felsökningsöverlägg är det nästan alltid fel: grönt eller rött avtecknar sig oftast bättre mot den typ av scen en kamera faktiskt ser, och en uttrycklig färg förmedlar avsikt.
5.6.3. Tjocklek och fyllning¶
De flesta geometriska metoderna tar två flaggor som avgör hur märket ritas:
thickness=Nanger linjebredden i pixlar. Standardvärdet är1, vilket duger för de flesta överlägg; ett större värde är användbart när en annotering måste förbli synlig mot en rörig scen eller efter att ett senare steg i pipelinen modifierar bilden ytterligare.fill=Trueväxlar märket från en kontur till ett fyllt sådant, och målar varje inre pixel med den valda färgen. Standardvärdet ärFalse.
Dessa flaggor gäller inte för de primitiver som inte har något inre att fylla – linjen, korset, pilen, fyrhörningen – där endast thickness är meningsfull.
5.6.4. Rita text¶
draw_string() skriver tecken ur ett inbyggt bitmappstypsnitt på 8 gånger 10 pixlar. x och y är hörnet längst upp till vänster på det första teckenets cell, text är strängen att rita, och color följer samma konvention som de geometriska metoderna. Typsnittet bär hela det skrivbara ASCII-intervallet och har ingen kerning – varje tecken upptar samma 8 pixlar breda cell – vilket gör utdatan lätt att positionera.
img.draw_string(10, 10, "blobs: 3", color=(0, 255, 0))
Strängen kan innehålla nyradstecken (\n); varje nyrad flyttar nästa tecken till början av en ny rad tio pixlar nedanför den föregående. Argumentet scale ritar varje tecken i en större storlek med en flyttalsfaktor, och x_spacing och y_spacing lägger till utfyllnad runt varje tecken. En liten uppsättning rotera- / spegla- / vänd-flaggor tillämpas antingen på hela strängen eller på varje tecken för sig – tillräcklig kontroll för att placera ut text längs en vinkel eller mot en icke-horisontell kant när layouten kräver det.
5.6.5. Rensa arbetsytan¶
En metod i familjen ritar inget specifikt märke. Den nollställer bara varje pixel i bilden:
clear()– nollställ varje pixel, eventuellt begränsat till ett ROI eller avgränsat genom en mask.
clear() är det rätta svaret när en applikation sätter samman en annotering från grunden varje bildruta – börja med en svart arbetsyta, rita de nya annoteringarna, lämna resultatet till skärmen – i stället för att lägga överlägg ovanpå den infångade bildrutan. Det är också det billigaste sättet att förbereda en tillfällig bild för användning som maskbuffert.
En nyligen allokerad bild är redan noll från konstruktorn, så clear() spelar roll specifikt för buffertar som återanvänds mellan bildrutor.