Intro
I have a webcam, connected to my Raspberry Pi server. Photos are taken every five minutes with fswebcam. Such collection of photos you can use for creating eg. time lapse video (here is an example of one-day video taken from my window). But you can also perform an analysis of image composition and it's variation over time.
Howto
Gathering data
Wen we have photos taken during a day gargered in one directory, we can use a simple script to analyse subsequent frames. ImageMagick is used to convert photos to 1x1 px size and get their HSB and RGB values.
#!/bin/bash OUT=webcam.dat echo "#i h s v r g b" > $OUT for image in *.jpg do ((i++)) hsb=`convert "$image" -colorspace hsb -resize 1x1 txt:- | sed 1d | tr '()%,:' ' '` h=`echo $hsb | awk '{print $8}'` s=`echo $hsb | awk '{print $9}'` v=`echo $hsb | awk '{print $10}'` rgb=`convert "$image" -colorspace rgb -resize 1x1 txt:- | sed 1d | tr '()%,:' ' '` r=`echo $rgb | awk '{print $3}'` g=`echo $rgb | awk '{print $4}'` b=`echo $rgb | awk '{print $5}'` echo "$i $h $s $v $r $g $b" >> $OUT done
Data visualisation
Then we use a gnuplot script to get pretty plots:
set pointsize 2 # Line style for axes set style line 80 lt rgb "#808080" # Line style for grid set style line 81 lt 0 # dashed set style line 81 lt rgb "#808080" # grey set grid back linestyle 81 set border 3 back linestyle 80 set xtics nomirror set ytics nomirror set xlabel "frame number" set terminal png nocrop enhanced font "Gill Sans,8" size 700,500 plik='webcam.dat' set ylabel "HSB [%]" set output "out/hsv-csplines.png" plot plik using 1:2 smooth csplines title "Hue" lt rgb "red" lw 1,\ plik using 1:3 smooth csplines title "Saturation" lt rgb "green" lw 1,\ plik using 1:4 smooth csplines title "Brightness" lt rgb "blue" lw 1 set output "out/hsv-bezier.png" plot plik using 1:2 smooth bezier title "Hue" lt rgb "red" lw 1,\ plik using 1:3 smooth bezier title "Saturation" lt rgb "green" lw 1,\ plik using 1:4 smooth bezier title "Brightness" lt rgb "blue" lw 1 set ylabel "RGB" set output "out/rgb-csplines.png" plot plik using 1:5 smooth csplines title "Red" lt rgb "red" lw 1,\ plik using 1:6 smooth csplines title "Green" lt rgb "green" lw 1,\ plik using 1:7 smooth csplines title "Blue" lt rgb "blue" lw 1 set output "out/rgb-bezier.png" plot plik using 1:5 smooth bezier title "Red" lt rgb "red" lw 1,\ plik using 1:6 smooth bezier title "Green" lt rgb "green" lw 1,\ plik using 1:7 smooth bezier title "Blue" lt rgb "blue" lw 1
Output: plots
HSB, with different methods of curves smoothing
RGB, with different methods of curves smoothing
Live monitoring
To get the plots almost live, we can use rrdtool to gather, store and plot those data. First, create rrd database:
#!/bin/bash rrdtool create hsb-rgb.rrd \ --step 300 \ DS:h:GAUGE:600:0:100 \ DS:s:GAUGE:600:0:100 \ DS:j:GAUGE:600:0:100 \ DS:r:GAUGE:600:0:255 \ DS:g:GAUGE:600:0:255 \ DS:b:GAUGE:600:0:255 \ RRA:AVERAGE:0.5:1:288 \ RRA:AVERAGE:0.5:6:336 \ RRA:AVERAGE:0.5:24:732 \ RRA:AVERAGE:0.5:144:14600 \ RRA:MIN:0.5:1:288 \ RRA:MIN:0.5:6:336 \ RRA:MIN:0.5:24:732 \ RRA:MIN:0.5:144:14600 \ RRA:MAX:0.5:1:288 \ RRA:MAX:0.5:6:336 \ RRA:MAX:0.5:24:732 \ RRA:MAX:0.5:144:14600
Then add such lines to your webcam script (launched from cron every 5 minutes). $OUT_FILE is variable pointing to a just taken photo.
hsb=`convert "$OUT_FILE" -colorspace hsb -resize 1x1 txt:- | sed 1d | tr '()%,:' ' '` h=`echo $hsb | awk '{print $8}'` s=`echo $hsb | awk '{print $9}'` v=`echo $hsb | awk '{print $10}'` rgb=`convert "$OUT_FILE" -colorspace rgb -resize 1x1 txt:- | sed 1d | tr '()%,:' ' '` r=`echo $rgb | awk '{print $3}'` g=`echo $rgb | awk '{print $4}'` b=`echo $rgb | awk '{print $5}'` # update rrd database: rrdtool update hsb-rgb.rrd "N:$h:$s:$v:$r:$g:$b"
Finally, after some data are collected, we can plot a nice graph (actually, we can plot it every five minutes, as new data arrives):
#!/bin/bash BAZA=hsb-rgb.rrd rrdtool graph hsb-24h.png \ --imgformat PNG \ --start "now-24h"\ --title="HSB [%]" \ --height 240 \ --width 420 \ --lazy \ --alt-autoscale \ --alt-y-grid \ DEF:h=$BAZA:h:AVERAGE \ DEF:s=$BAZA:s:AVERAGE \ DEF:j=$BAZA:j:AVERAGE \ LINE2:h#FF0000:"Hue"\ LINE2:s#00FF00:"Saturation"\ LINE2:j#0000FF:"Brightness"</pre> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFCZoyRIhEXYQEgSiiI3RGEZFtSfnJog6hNDprEf8JzjU7_1v8DCDAnxSUuxBcq3tqSYGJkfdr4UoZ2rHV-BBREHFU8KE4Flnob8XnD7_5PhWOzuxG9B8sidzWmhX8PGtMGFU0Rlo_l7XL/s1600/HSB-24h.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFCZoyRIhEXYQEgSiiI3RGEZFtSfnJog6hNDprEf8JzjU7_1v8DCDAnxSUuxBcq3tqSYGJkfdr4UoZ2rHV-BBREHFU8KE4Flnob8XnD7_5PhWOzuxG9B8sidzWmhX8PGtMGFU0Rlo_l7XL/s320/HSB-24h.png" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyGserUs6dUyqdudZA5_UagqTuZTj_weClykD_LKd_6ENAYSKw5tuqsugFVGbGH73rxJAH1kDhs2dCF_DBLB_H_dxZsD6k7XRRYFcdzP9uVgJKxIdA675z53hNIAeX0BXE2UsswMLBRK9D/s1600/RGB-24h.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyGserUs6dUyqdudZA5_UagqTuZTj_weClykD_LKd_6ENAYSKw5tuqsugFVGbGH73rxJAH1kDhs2dCF_DBLB_H_dxZsD6k7XRRYFcdzP9uVgJKxIdA675z53hNIAeX0BXE2UsswMLBRK9D/s320/RGB-24h.png" /></a>
Brak komentarzy:
Prześlij komentarz