Powershell – Läs RGB information ur bilder

Har nu skrivit en ny funktion till vår hemautomationsmodul till Powershell.

ELpatron sett från dlink kameran

Bildanalysering med Powershell.

Den nya funktionen “Read-MJ-ImageRGBPixel” returnerar information om pixlars färger i en bild. Vad är det som är så bra med detta? Nu är det möjliggör att trigga / övervaka “visuellt” med script!

Med vilken billig webbkamera som helt och Powershell går det nu att läsa information ur bilder. Detta gör att webbkameror kan trigga händelser i olika system genom att “se färg” och inte bara agera på “rörelse”. Nyttjar den själv till både Vera och Telldus Znet.

Varför?

(För att det går!) Orsaken till att jag skrev funktionen var för att “se” om lysdioden på elpatronen lyste via en webbkamera. Detta ville jag sedan få in i Vera på något enkelt sätt. Tyvärr fanns det inte något liknande till Powershell som fungerade för mig….

Hur fungerar det?

Funktionen jag skrev läser in en bild och översätter det till en bitmap, detta kan sedan analyseras. Genom att analyser X och Y koordinaterna i bilden där lysdioden befinner sig. pixelns färg avgör om jag ska aktivera / inaktivera något (I mitt fall Veran och Telldus Znet Lite). Nästa steg är att visa detta med NeoPixels på en Arduino eller ESP8266, typ som en led extender 🙂

Genom att köra “help Read-Mj-ImageRGBPixel” (Efter att modulen / funktionen är installerad, se info längst ner på sidan) visas hur modulen fungerar och vilken typ av data som kan returneras.

Read-MJ-ImageRGBPixel

Help Read-MJ-ImageRGBPixel (Version 2)

Exempel

Exemplen nedan laddar ner en bilder från Dlink och Hikvision kameror, resultatet sparas i mappen C:\temp. Filen skickas sedan in i funktionen “Read-MJ-ImageRGBPixel”. Funktionen läser vilken RGB färg som finns runt pixel  X430 och Y864 med en pixelarea på 4. Dvs den läser in pixlar i en fyrkant runt om pixeln jag vill veta för att få ett snitt på respektive färg.

 

Vart finns X och Y koordinaten för pixeln i bilden?

För att lättast ta reda på vart pixeln finns i en bild, öppna bilden med paint (MSpaint.exe), håller markören över området/pixeln som ska avläsas med scriptet. Längst ner till vänster skrivs nu X och Y koordinater ut. Dessa anges sedan i scriptet.

MsPaint

Genom att hålla markören över ett område i MSPaint visas X och Y pixel koordinater. Vänster sida motsvarar X Höger sida motsvarar Y

 

Vad kan detta nyttjas till?

Finns det en bild på internet som innehåller information som du inte kan nå via text? Ladda hem bilden och analysera den med funktionen. Det går enkelt att analysera en större mängd bilder från övervakningskameror och “se” när något flyttats. Detta kräver en del jobb, men det går!

Visar nu ett konkret exempel på hur jag nyttjar funktionen och  bäddar in detta i ett script . Resultatet nedan visar hur hur ofta elpatron gick under April.

Hur ofta kördes elpatronen den här månaden:

Med hjälp av bilder som sparats var 5:e minut dygnet runt under någon månads tid, kunde jag i efterhand beräkna någorlunda förbrukning. Bilderna som jag sparade hade namnformatet “Pannrum – YYYY-MM-DD _ HH mm ss.jpg“. Jag fick indirekt koll på hur ofta pelletsbrännaren hade strulat med…

Först tog jag reda på vart i bilden X och Y koordinaterna fanns för lysdioderna “3kW” och “6kW” på elpatronen. Med hjälp av koordinaterna i bilderna kunde jag sedan se hur ofta dioderna lyste.

Innehållet i bilderna som analyseras är två röda lysdioder (markerade med en pil på bilderna nedan).

Elpatron sett från dlink kameran

Bilder: Vänster: El av, Mitten: 6kW, Höger : 3kW

Resultatet i Powershell färgkodades för att visuellt se att scriptet träffat rätt.

  • Grön text: medelvärdet på 3kW och 6kW överstiger inte 80  (dvs varken 3kW eller 6kW lyser)
  • Röd text: medelvärdet på 3kW överstiger 80, medans medelvärdet på 6kW ej överstiger 80 (dvs 3kW lyser)
  • Gul text: medelvärdet på 3kW överstiger ej 80, medan medelvärdet på 6kW överstiger 80 (dvs 6kW lyser)
Exempelel2

Grön text: värdet efter 3kW och 6kW överstiger inte 80 (dvs elpatronen var avstängd) Röd text: värdet efter 3kW överstiger 80, dvs 3kW patronen var aktiv. Gul text: värdet efter 6kW överstiger 80, dvs 6kW patronen var aktiv

Resultatet summerar längst ned i scriptet, vilket ger någorlunda koll på den beräknade förbrukningen bara genom att avläsa bilderna. Detta tog två tre minuter att gå igenom.

Exempelel

Resultatet av 7138 bilder verkar stämma relativt bra, tog lite stickprov och alla var korrekta. 24 dagar har 34560 minuter, dvs uträkningen blev inte helt 100, men avläsningen ur bilden är helt ok.

För att få resultatet ovan kördes följande script mot mappen där alla bilder fanns.

 

Arduino

Genom att nyttja funktionen “Send-MJ-ArduinoData” som finns i Powershell modulen, går det visuellt att återspegla dessa två lysdioder i realtid! Paketering och konvertering till en ESP8266 återstår (kommer snart mer info om detta med).

ArduinoOchNeoPixelOFF

Arduino – Ingen el aktiv

 

ArduinoOchNeoPixel

Arduino – 3kW aktiverad, dvs höger diod lyser rött.

 

Function Read-MJ-ImageRGBPixel

Vill du inte ladda hem och köra hela modulen utan bara är intresserad av den här funktionen så finns den här, om du spinner vidare på den eller dela den vidare ge gärna creds och länk till Automatiserar.se

Vad behövs???

Vad behövs för att köra detta? En Dator med Windows 8.1 eller nyare (Jag har byggt den på Windows 10, så där fungerar den garanterat!). Utöver det behövs modulen laddas hem och placeras under “C:\Program Files\WindowsPowerShell\Modules\Automatiserar” och namnges till “Automatiserar.psm1“.

Modulen finns att hämta på vår Github

När detta är gjort startar du powershell.exe som administratör och skriver “Set-ExecutionPolicy -ExecutionPolicy RemoteSigned“, detta tillåter script och liknande att köras lokalt på klienten. Stäng powershell och öppna det på nytt igen. Nu är modulen redo att användas!

Hoppas du hittar någon nytta med funktionen och modulen, har du någon bra idé på vad mer som skulle behövas i funktionen eller saknas skriv gärna det så vi får veta.

Gilla och dela gärna sidan så vi ser att det uppskattas det vi gör!

// Ispep

Powershell – Läs RGB information ur bilder
Ge ett betyg på innehållet

4 kommentarer

  1. Så härligt nördigt 🙂

  2. Häftigt!… Men vad händer om kameran rör på sig en smula? Får en liten knuff..
    Då blir det väl andra koordinater och skriptet ballar ur?

    • Ispep

      2016-05-10 at 11:33

      precis, rör sig kameran så missar du informationen du söker (om du skickar en statisk pixel)
      Om den pixeln du söker rör sig skriver man helt enkelt en loop som anger ett område i bilden där det vill hitta finns inom, sedan kontrollerar man pixel för pixel inom området.

      Ska snart skriva ett sådant exempel som jag själv kör 🙂

      // Ispep

Kommentera

E-postadressen publiceras inte.

*

© 2017

Tema av Anders NorenUpp ↑

%d bloggare gillar detta: