Jag behövde....
1 webbkamera
1 ds2413
2 motstånd
2 vita lysdioder
? timmar arbetstid (på tok för många sena kvällar under julhelgen men det var skoj....)
imagemagick (bildbehandling)
gocr (ocrprogram)
php + rrdtool för presentationen
bash script för all analys som sker autmatiskt förståss.
1wire kretsen, dioderna och motstånden är min belysning som tänds och släcks via owfs vid varje avläsning. Webkameran tar en stillbild i 640x480 upplösning. Ur den bilden croppar jag fem ytor, en för räkneverket och sen vardera av de fyra "röda hjulen".
Jag började med OCR av mätarställningen men det blev svårare än jag trodde, trots bildbehandling, tightare croppning är det ingen vidare säkerhet i avläsningen (okay att det inte funkar när visarna rullar över till nästa siffra men ändå på tok för många läsfel hitintills att den inte är användbar ännu utan lite databehandling efteråt...)
Hjälp mottages tacksamt med hur man bäst tolkar bilden som ser ut så här som i detta fall missade 8:an - jag har inget problem att trimma in gocr att läsa siffrorna på en enstaka bild men jag har inte hittat någon inställning som fungerar på flertalet av inläsningarna (jag har en massa testdata nu i alla fall).
kör just nu med "gocr -C 0123456789 -f UTF8 counter.tiff -o stallning.txt -l 128 -d 200" där -l sätter threshold för nivåerna i bilden och -d reduceras "dust" som i mitt fall är skuggorna i masken som har hålen för de fem positionerna.
Nu till det skojjiga som däremot fungerar ALLDELES UTMÄRKT och ÖVER FÖRVÄNTAN.....
Jag klurade en stund på hur jag skulle tolka de fyra röda hjulen som visar 100-tals, 10-tals, 1-tals liter och inte minst, jo faktiskt minst, 1 dl's förbrukningen och gjorde några snabba experiment som verkade lovande och knåpade ihop följande:
- croppar ut de fyra mätarna ur bilden på vattenmätaren
- analyserar en mätare i taget (från minsta till högsta vilket visade sig bli nödvändigt)
- croppar ut en liten area ur mätarna i området mellan två siffror (se bild )
- vrider mätarbilden 36 grader 9 gånger och croppar ut arean så jag nu har 10 små bilder, typ 20x20 pixlar
- drar upp färgmättnaden i bilden dramatiskt (med imagemagick) för att framhäva det röda (resten är ju svart text på vit bakgrund) samt ljusar upp bilden för att "överexponera" allt som är nästan vitt.
- reducerar antalet färger till 8 (Blir i praktiken nästan bara tre färger kvar, svart, vit och röd)
- kör histogramfunktionen i imagemagick och lägger antalet röda pixlar på minnet för vardera av de 10 områdena
- kollar om någon av dem har flerfaldigt fler röda pixlar än de andra 9 områdena vilket nästan alltid är fallet ! (tydlig markering var visaren står alltså)
- om marginalerna är sämre gör jag en ny bedömning av sannolikheten baserat på hur den mätare med den mindre valören står, är den 0-5 så har ju den mätare jag nu analyserar just slagit om, men är den andra 5 eller högre så är ju min visare på väg att slå om och då får jag ju avrunda upp eller ner beroende på den andra visarens värde - detta var nyckeln till säkerhet i avläsning, annars fick jag hopp på 1, 10 eller 100 liter då och då. Man kommer ALDRIG kunna definiera områdena perfekt men med denna metod har man ganska god slarvmån.... (visarna i sig står inte direkt på markeringen när den andra visaren passerar noll, ganska ofta faktiskt ser den ut att vara "tjugo över två" när den borde vara "två"....
- petar in siffrorna i rrdtool och plottar en graf
Så nu vet jag vad toaletten drar när man spolar det lilla och det stora, hur länge jag dushar, att frun dushar på halva tiden, att nån spolat på toaletten mitt i natten...och med lite fantasi kan man ju ha ett larm på om det går åt vatten när man inte är hemma.
Jag trodde inte detta skulle fungera men det gör det. Scripten kan jag dela med mig av, de ska städas till lite först bara. Svårigheten i projektet var att hitta ett optimalt område att detektera rödfärg i, att samt att komma på den enkla men avgörande bildbehandlingen med färgmättnad och ljushet samt implementera logiken för att kika på nästa värdesiffra. Jag gjorde en bra debugsida som visade alla fyra mätarna roterade i alla 10 positioner med analysområdet markerat plus den lilla croppade ytan för sig som fått reducerade färger och höjd färgmättnad vilket gjorde det ganska lätt att trimma in det hela. Den sidan visade också statistiken för antalet pixlar per mätområde, tolkad siffra, sannolikhet för den tolkningen, när "domarfunktionen" trädde in och gjorde en ny tolkning baserat på en annan visare etc.
Min webkamera sitter inte helt vinkelrätt mot mätaren så alla visare är mer eller mindre ovala och det konvexa glaset gör sitt till också, trots detta har jag hitintills inga mätfel över 1dl vad jag vet. Reflexer från de två lysdioderna har jag inte fått tack vare att de har en vinkel på kanske 25 grader relativt kameran (är man hobbyfotograf så är man)
Overkill? Ja visst, men alternativet hade varit att äta julmat och se på repriser på TV - och då tyckte jag det var mycket mer kreativt att göra detta i stället

mvh /Anders