Archive for 21 augusti, 2013

Att skapa video från stillbilder

21/08/2013

Uppdaterad 25.8.2013 kl. 10.15.

Jag övervakar mitt växthus med hjälp av en Raspberry Pi dator som kör en helt normal Linux. Om allt går som beräknat bör jag under växtperioden samla in ungefär 1500 separata bilder i jpeg format. Bilderna tas automatiskt med 30 minuters intervall.

För att man enkelt skall kunna följa med hur växterna växer måste jpeg bilderna kombineras så att man får en normal videosekvens. Hur man gör detta med hjälp av Linux beskrivs nedan.

Jag har då den här artikeln skrivs ungefär 130 jpeg-bilder från det att jag ursprungligen sådde tills idag, tre dagar senare. Bildmängden är inte ännu ofantlig så det kan vara bra att i det här skedet se hur processeringen skall göras.

Det första steget är att installera ImageMagick på min bordsdator … som är betydligt snabbare än RaspberryPi. All bildbehandling görs alltså på min ”stora” dator eftersom den är åtminstone 2 – 3 ggr. snabbare än RPi. I princip skulle det inte finnas några hinder för att all bildbehandling skulle ske direkt på RPi.

Det visade sig att den andra komponenten jag behöver d.v.s. ffmpeg redan var installerad.

All bildbehandling sker direkt från kommandoraden. Innan man sätter igång är det skäl att skapa en katalog med kopior av alla bilderna eftersom bildbehandlingen är destruktiv … vi vill inte förstöra orginalen. Jag skapade en ny katalog för bilderna ~/Dokument/still_till_video och kopierade alla bilder jag till idag har samlat in:

lasse@deNeb:~/Dokument/still_till_video$ cp /media/lasse/80C5-90E6/*.jpg .
test0.jpg test11.jpg test22.jpg test42.jpg test62.jpg test82.jpg
test100.jpg test120.jpg test23.jpg test43.jpg test63.jpg test83.jpg
test101.jpg test121.jpg test24.jpg test44.jpg test64.jpg test84.jpg
test102.jpg test122.jpg test25.jpg test45.jpg test65.jpg test85.jpg
test103.jpg test123.jpg test26.jpg test46.jpg test66.jpg test86.jpg
test104.jpg test124.jpg test27.jpg test47.jpg test67.jpg test87.jpg
test105.jpg test125.jpg test28.jpg test48.jpg test68.jpg test88.jpg
test106.jpg test126.jpg test29.jpg test49.jpg test69.jpg test89.jpg
test107.jpg test127.jpg test2.jpg test4.jpg test6.jpg test8.jpg
test108.jpg test128.jpg test30.jpg test50.jpg test70.jpg test90.jpg
test109.jpg test129.jpg test31.jpg test51.jpg test71.jpg test91.jpg
test10.jpg test12.jpg test32.jpg test52.jpg test72.jpg test92.jpg
test110.jpg test13.jpg test33.jpg test53.jpg test73.jpg test93.jpg
test111.jpg test14.jpg test34.jpg test54.jpg test74.jpg test94.jpg
test112.jpg test15.jpg test35.jpg test55.jpg test75.jpg test95.jpg
test113.jpg test16.jpg test36.jpg test56.jpg test76.jpg test96.jpg
test114.jpg test17.jpg test37.jpg test57.jpg test77.jpg test97.jpg
test115.jpg test18.jpg test38.jpg test58.jpg test78.jpg test98.jpg
test116.jpg test19.jpg test39.jpg test59.jpg test79.jpg test99.jpg
test117.jpg test1.jpg test3.jpg test5.jpg test7.jpg test9.jpg
test118.jpg test20.jpg test40.jpg test60.jpg test80.jpg
test119.jpg test21.jpg test41.jpg test61.jpg test81.jpg

Orginalen finns kvar på minnepinnen vilket betyder att om jag klantar mig vid bildbehandlingen är det bara att börja om från början.

Jag börjar processen med att skala om bilderna med programmet mogrify som är en del av ImageMagick programpaketet.

mogrify -resize 1024×768 *.jpg

Det lagringsutrymme vi behöver minskar rätt drastiskt genom att bilderna blir mindre …
Utrymmesbehovet sjönk från ca. 2 MByte till 0.5 MByte räknat per delbild.

Följande skede är att knyta ihop delbilder så att vi skapar mellanliggande bilder som är ”medeltal” av bilderna på vardera sidan. Vi får på detta sätt en video som kör mjukare. Jag låter programmet skapa två mellanliggande bilder mellan varje bildpar.

convert *.jpg -delay 10 -morph 2 %05d.morph.jpg

Resultatet blev en serie på 387 bilder som vi nu skall knyta ihop till en video och omforma så att videon kan spelas med vanliga videospelare.

Resultatet blev en mp4 video som kör utan problem. Storleken är 13.8 MByte.
Hela processen kan automatiseras geom att lägga kommandona i ett skript (kommandofil).

Det visade sig att videon blev fel eftersom sorteringen av bildfilerna inte stämde. Problemet löstes genom att lägga till ett lämpligt antal förnollor före nummern i bildfilerna. Mina råa bildfiler heter test0.jpg , test1.jpg … test10.jpg … test99.jpg , test100.jpg osv. Problemet är att datorn uppfattar att filernas ordningsföljd utan förnollor borde vara test0.jpg, test1.jpg, test10.jpg … test2.jpg etc. Problemet löstes genom att automatiskt döpa om filerna till test0001.jpg, test0002.jpg etc. vilket nu sorteras korrekt.

#!/bin/bash
# Script to copy pictures from the flsh drive and process
# these pictures into a mp4 video.
date
rm *.jpg
rm *.mp4
cp /media/lasse/80C5-90E6/*.jpg .
# Change numbering to sort correctly by adding suitable number of zeros before numbers
prename ‘s/test/test0/’ test?.jpg
prename ‘s/test/test0/’ test??.jpg
prename ‘s/test/test0/’ test???.jpg
mogrify -resize 1024×768 *.jpg
convert *.jpg -delay 10 -morph 2 %05d.morph.jpg
ffmpeg -r 25 -qscale 1 -i %05d.morph.jpg output.mp4
# Remove temporary files not needed anymore…
rm *.jpg
echo ”Done!”
date

Totaltiden för hela processen var ungefär två minuter av vilken största delen gick till kopiering av bilddata från RPi till minnepinnen och från minnefinnen till min dator.

307_20130825

Fig. 1  Situationen den 25.8 d.v.s. en vecka efter sådd. Det kraftiga rödsticket i bilden beror på LED-belysningen som innehåller endast röda och blå våglängder. Orsaken till att det går att urskilja andra färger är att jag separat belyser plantorna med en 4 W vit LED-lampa. Det vita ljuset gör att det speciella växtljuset blir mindre irriterande för ögonen.

 

 

 

 

 

 

Övervakning av miniatyrväxthus

21/08/2013

I artikeln ”Miniatyrväxthus, odling i rymden mm.” gav jag en viss bakgrund till de experiment man gjort gällande extremt effektiv odling på små ytor med tanke på framtida rymdfärder. Om man vill följa med växtprocessen i detalj måste man naturligtvis mäta tillväxthastigheten på något lämpligt sätt, vattenförbrukning, växtunderlagets fuktighet, ljus etc. Den enda rationella metoden att i detalj följa en växtperiod över ca. 30 dagar är att automatisera processen.

IMGP5345

Fig. 1  Bilden visar datorn ”Raspberry Pi” som är en brittisk ”system på en chip” dator som kör operativsystemet Linux. Mitt system är försett med en kamera på ändan av flatkabeln (grå). Raspberry Pi kostar ungefär 30 Euro och kameran ungefär lika mycket. Kameran tar förvånande bra bilder, sensorn går på 5 Megapixlar.

För närvarande sköter datorn endast en kontinuerlig fotografering av växtunderlagen. Jag har skrivit två små program i programspråket Python. Det ena är ett skelett (som senare byggs ut) för ett grafiskt användarinterface och det andra är själva fotoprogrammet. Programmen har följande utseende:

#!/usr/bin/python

import pygtk
 pygtk.require("2.0")
 import gtk
 import os

class test(object):
    def __init__(self):
        filename = "test.glade"
        builder = gtk.Builder()
        builder.add_from_file(filename)
        builder.connect_signals(self)
        window = builder.get_object("main")
        window.show_all()
        os.system("touch run")
        os.system("./speedup.py &")

    def onDeleteWindow(self):
        exit(0)

    def onButtonExit(self, widget):
        os.system("rm run")
        exit(0)

if __name__ == "__main__":
 app =test()
 gtk.main()

Programmet har ett användarinterface baserat på Glade/gtk. Programmet gör egentligen inget annat än att det startar bakgrundsprogrammet ”speedup.py” och via en fil skickar en signal till ”speedup.py” om huvudprogrammet vill stoppa bakgrundsprogrammet. Observera att indenteringen i ovanstående programlistning kan vara felaktig eftersom mellanslag och tabulatur lämnas bort på en vebbsida. Som programmet ser ut på skärmen så kan det bryta mot Pythons syntax och således inte vara körbart om det kopieras rätt av från vebbsidan.

Bakgrundsprogrammet som sköter fotografering med 30 minuters mellanrum har följande utseende:

#!/usr/bin/python
# Camera testing program
# Name: speedup.py
import os
import time
i = 0
while(True):
   if (os.path.exists("./run")):
      cmd ="raspistill -v -rot 180 -o test" + str(i)
      cmd = cmd + ".jpg"
      print cmd
      os.system(cmd)
   else:
      print "Program done"
      exit(0)
      time.sleep(1800)
   i = i + 1

Programmet är en oändlig slinga som kontrollerar om programmet får köra d.v.s. om filen ”run” går att hitta. Om programmet får köra så skapas ett kommando för att ta ett foto. Ett kommando för att ta ett foto med kameran, med hjälp av programvara för kameran, är:

raspistill -v -rot 180 -o <filnamn>

Eftersom jag vet att jag kommer att ta över tusen bilder under testkörningen är det skäl att generera filnamnet så att bilderna numreras på ett vettigt sätt. Jag bygger upp filnamnet på följande sätt:

test + <löpande nummer> + ”.jpg”

Koden för namnet på en bild blir då (variabeln i är löpande nummer som stegas framåt med ett steg för varje bild):

test + str(i) + ”.jpg”

Kommandot str(i) förvandlar innehållet i variabeln ”i” till en textsträng. Om i har värdet 999 får vi alltså ”test + ”999” + ”.jpg”. Om jag vill ta en bild med namnet ”test999.jpg” så kan jag göra det genom att från kommandoraden ge kommandot:

raspistill -v -rot 180 -o test999.jpg

Flaggan -rot 180 i kommandot gör att bilden svängs upp och ned (kameran är för tillfället upp och ned och detta korrigeras genom att be kameran svänga bilden).

Vilket är läget idag

Det är nu ungefär tre dagar sedan jag sådde sallad och man ser tydligt att ett antal frön har grott. Jag planerar att sätta ihop fotografierna av växtprocessen till en video där tidsavståndet mellan rutorna är 30 minuter.

IMGP5344

Fig. 2  Tredje dagen …

Jag gissar att det inom några dagar går att se rörelse då jag kombinerar bilderna. Hittills har programmet tagit strax över hundra bilder.

Tre veckor har gått och det börjar vara ont om plats i krukorna. Som jag gissade går det livligt till då man tittar på hur växterna växer då man snabbar upp processen till 8 bilder motsvarar en sekund vilket betyder att en sekund på videon motsvarar fyra timmars tillväxt.


Pointman's

A lagrange point in life

THE HOCKEY SCHTICK

Lars Silén: Reflex och Spegling

NoTricksZone

Lars Silén: Reflex och Spegling

Big Picture News, Informed Analysis

Canadian journalist Donna Laframboise. Former National Post & Toronto Star columnist, past vice president of the Canadian Civil Liberties Association.

JoNova

Lars Silén: Reflex och Spegling

Climate Audit

by Steve McIntyre

Musings from the Chiefio

Techno bits and mind pleasers

Bishop Hill

Lars Silén: Reflex och Spegling

Watts Up With That?

The world's most viewed site on global warming and climate change

TED Blog

The TED Blog shares news about TED Talks and TED Conferences.

Larsil2009's Blog

Lars Silén: Reflex och Spegling