Avrapportering:
Än så länge har jag bara jobbat mot förinspelade videos, så ta denna redogörelse för vad den är. Har i alla fall lyckats få till positionering av skala och bom.
Nedan följer en mycket förenklad redogörelse för hur mitt program för närvarande jobbar.
Grovkalibrering
Grovkalibreringen är mycket beräkningsintensiv och sker normalt endast när Raspberry'n startar. I normalfallet bearbetas endast en enda bild. Misslyckas grovkalibreringen går man vidare och försöker med nästa bild. Om kalibreringen inte lyckats efter tre bilder avbryts den. Då är ljusförhållandena fel eller så är kameran felriktad. Grovkalibreringen ska också kunna forceras fram med en knapptryckning.
Grovkalibreringen bygger på de två röda prickar som målats på det övre respektive nedre skal-tecknen. Bilderna genomsöks efter pixlar som uppfyller vissa färgvillkor. En mycket stor mängd färgvillkor prövas. Färgdjupet är 24 bitar viket innebär att varje enskild pixel kan anta ett mycket stort antal olika färger (16 777 216 st). Exakt vilken färg varje pixel får varierar med ljussättning. För varje färgvillkor kontrolleras om två och endast två var för sig sammanhängande (men tillsammans separerade) områden identifierats. Om så är fallet så kontrolleras om de två områdenas inbördes positioner och storlekar är rimliga. Godtas även dessa så anses de röda prickarna vara korrekt identifierade. Med hjälp av prickarnas position och avstånd är det enkelt att beräkna vilka delområden som är relevanta för att fastställa skal-tecknens och bommens höjd-positioner.
Efter grovkalibreringen får man alltså inte flytta runt kameran hur som helst. Mindre förändringar är dock OK.
scale_orginal.jpg
scale_reddot.jpg
scale_crop.jpg
Finkalibrering
Finkalibreringen utförs i samband med att varje laddning startar samt direkt efter det att en laddning bedöms som färdig. Det gör dispensern okänslig för mindre lägesförändringar mellan kamera och våg. Det ska alltså inte göra något om man råkar stöta till våg eller kamera under arbetets gång.
I finkalibreringen bearbetas endast de delområden som grovkalibreringen fastställt. Bilden skärs alltså ner till fyra mindre bitar. Resten av informationen är irrelevant och kasseras. Ca 93 % av bilden dumpas direkt.
Om bommen är i ett sådant läge att den stör finkalibreringen av något av skaltecken, så finkalibreras endast de övriga två. Har dessa flyttas sig jämfört med föregående laddning (våg eller kamera tillstött), så beräknas positionen för det tredje skaltecket (det som störs av bommen).
Det första som görs är att delbilderna konverteras till gråskala. Av pedagogiska skäl visar jag här obeskurna bilder (med gröna ramar kring de områden som bearbetas).
scale_gray.jpg
Därefter ”grumlar” jag bilden. Grumlingen gör bilden suddig men minskar ”mängden kontrastgränser”. Man ”tvättar” således bort mindre reflexer och andra störande ”feltolkningar” (jämför bilderna).
scale_blur.jpg
Sedan konverterar jag bilden 64 gånger till svartvit. Vid varje konverteringen tillämpar jag olika tröskelvärden. Tröskelvärdet anger hur mörk/ljus en pixel måste vara för att tolkas som svart/vit. Ett högre tröskelvärde ger fler svarta pixlar. Varje bild utvärderas sedan. En acceptabelt tröskelvärde medför endast ett vitt sammanhängande område per beskuren delbild. Varje sådant vitt område ska även vara av en acceptabel storlek.
scale_threshold.jpg
Om vi nu lägger ut våra beskurna, grå-konverterade, grumlade och svart-vit-konverterade bilder på en svart bakgrund, så ser det ut så här.
scale_core.jpg
Därefter tar jag fram en ”minsta omslutande cirkel” för respektive vita område i respektive beskurna delbild. Cirklarnas centrum befinner sig i respektive objekts vertikala mittpunkt. Notera att det för denna bild inte är möjligt att positionera det övre skaltecknet pga att bommen stör. Jag har tagit mig friheten att ändå ritat ut cirkeln. Notera att även bommen är ”cirklad”.
scale_circle.jpg
Skaltecknens vertikala positioner är därmed fastställda. Även lämpligt tröskelvärde för fastställande av bomposition är bestämt.
Bompositionering
Bompositionering sker på likartat sätt. Skillnaden är följande:
- bommen positioneras för samtliga bilder (skaltecknen bara för två bilder per laddning (när laddningscykeln startar och slutar)).
- lämpligt tröskelvärde är redan hittat, så endast en (1) konvertering till svart-vitt behöver göras.
- endast den delbild som avser bommen skärs ut och bearbetas.
Om man för varje cirkel ritar ut en horisontell linje som passerar genom respektive cirkels centrum, så ser det ut så här.
scale_lines.jpg
Självklart är det så att programmet jag bygger inte jobbar med visuella bilder på detta sätt som beskrivs här. I programmet är en bild bara en enorm matris full av numeriska värden. Bilder är bara för mänskliga hjärnor.
Jag kommer nu att lämna fasen med förinspelad video och gå över på ”live streaming”. Har ingen stegmotor ännu, så jag får nedlåta mig till att kasta i ballast manuellt i vågskålen. Jag ämnar också ägna en del tid tid åt test. Kommer att provocera systemet på alla tänkbara sätt (luftdrag, knuffar, vibrationer, dålig kamera placering, undermåligt ljus, skrikande barn, arg fru, . . .), för att hitta dess svaga punkter och hantera abnormiteter.
Jag inser att endast en mycket liten del av jobbet är gjort. Samtidigt känns det som jag klivit över en hejdlöst hög tröskel . . .
Mjukvaruutveckling 27 timmar.
Lärdom nummer 4: Studierna i Python och image recognition betalar sig. Jag kan fokusera på de verkliga problemen utan att bekymra mig allt för mycket om verktygen. Lite som att kunna cykla faktiskt

Du har inte behörighet att öppna de filer som bifogats till detta inlägg.