Skip to content

Instantly share code, notes, and snippets.

@predictiple
Created August 27, 2015 13:32
Show Gist options
  • Save predictiple/b0564741187c5188821e to your computer and use it in GitHub Desktop.
Save predictiple/b0564741187c5188821e to your computer and use it in GitHub Desktop.
#!/bin/bash
interval=$(printf "%s" "$1"|tr -dc '[:digit:]')
half_interval=$(expr $interval \/ 2)
interval=$(expr $half_interval \* 2)
interval_text=$(date -u -d "@${interval}" "+%T")
date_text=$(pwd |rev |cut -d"/" -f1 |rev |cut -d" " -f1)
full_date_text=$(pwd |rev |cut -d"/" -f1 |rev)
mkdir ${date_text}_events
event_count=$(find ./${date_text}_motion/ -type f -iname "*.jpg" -print | wc -l)
find ./${date_text}_motion/ -type f -iname "*.jpg" -print |cut -d"/" -f3 |cut -d"." -f1 |sort | while read event
do
event_time_text=$(echo ${event} | tr "-" :)
event_time_num=$(date +%s -d $event_time_text)
half_interval_before_num=$(expr $event_time_num - $half_interval)
half_interval_before_text=$(date -d "@${half_interval_before_num}" "+%T")
half_interval_after_num=$(expr $event_time_num + $half_interval)
half_interval_after_text=$(date -d "@${half_interval_after_num}" "+%T")
echo -e "\e[102m\e[30m\e[1m$event_count events still to be processed\e[0m"
echo " "
echo -e "\e[1m\e[92mNow processing event ${event}\e[0m"
echo " "
echo -e "\e[40m\e[1mdate_text is \e[93m$date_text\e[0m"
echo Event date is $full_date_text
echo -e "\e[40m\e[1mEvent time_text is \e[93m$event_time_text\e[0m"
echo Event time is $event_time_num
echo Event interval is $interval seconds
echo Half-interval is $half_interval
echo $half_interval seconds before is $half_interval_before_num
echo $half_interval seconds before text is $half_interval_before_text
echo $half_interval seconds after is $half_interval_after_num
echo $half_interval seconds after text is $half_interval_after_text
## Make a folder for each clip
event_dir="./${date_text}_events/${date_text}_${event}"
echo -e "\e[101mCreating events folder $date_text_${event}\e[0m"
mkdir "${event_dir}"
echo " "
## Copy motion clip
echo -e "\e[101mCopying motion event image: motion_$event.jpg\e[0m"
cp ./${date_text}_motion/$event.jpg $event_dir/motion_$event.jpg
echo " "
## Extract clip from X seconds each side of the target time
echo -e "\e[101mExtracting ${interval} seconds clip from $half_interval_before_text to $half_interval_after_text\e[0m"
echo -e "\e[100m ffmpeg -y -i ${date_text}.mp4 -ss $half_interval_before_text -t $interval_text -vcodec copy -an $event_dir/${date_text}_${event}.mp4\e[0m"
time ffmpeg -v 16 -nostdin -y -i ${date_text}.mp4 -ss $half_interval_before_text -t $interval_text -vcodec copy -an $event_dir/${date_text}_${event}.mp4
echo " "
## Extract all frames from the clip
echo -e "\e[101mExtracting frames from clip ${date_text}_${event}.mp4\e[0m"
mkdir "${event_dir}/frames"
ffmpeg -v 16 -nostdin -y -i $event_dir/${date_text}_${event}.mp4 -qscale:v 2 $event_dir/frames/frame-%02d.jpg
echo " "
## Create montage image
echo -e "\e[101mCreating filmstrip image: filmstrip_$date_text_${event}.jpg\e[0m"
frame_count=$(find $event_dir/frames/ -type f -iname "*.jpg" -print | wc -l)
strip_rows=$(expr $frame_count \/ 3)
strip_rows_extra=$(expr $strip_rows + 1)
montage $event_dir/frames/frame-*.jpg -title "$full_date_text: $half_interval_before_text - $half_interval_after_text" -set label "%f" -background "#e0e0e0" -tile 3x$strip_rows_extra -geometry 400x225+10+10 -shadow $event_dir/filmstrip_$date_text_${event}.jpg
echo " "
## Create the composite MIN image
convert -evaluate-sequence min $event_dir/frames/frame-*.jpg $event_dir/composite_min_${date_text}_${event}.jpg
## Create the composite MAX image
convert -evaluate-sequence max $event_dir/frames/frame-*.jpg $event_dir/composite_max_${date_text}_${event}.jpg
echo -e "\e[101mCreating composite colour image: composite_colour_${date_text}_${event}.jpg\e[0m"
convert -evaluate-sequence mean $event_dir/frames/frame-*.jpg -normalize $event_dir/mean.jpg
convert -evaluate-sequence subtract $event_dir/mean.jpg $event_dir/composite_max_${date_text}_${event}.jpg $event_dir/sub_mean_max.jpg
convert -evaluate-sequence add $event_dir/sub_mean_max.jpg $event_dir/composite_min_${date_text}_${event}.jpg $event_dir/add_mean_min.jpg
convert $event_dir/add_mean_min.jpg $event_dir/mean.jpg -compose changemask -fuzz 5% -composite $event_dir/add_mean_min_bg_removed.png
convert $event_dir/mean.jpg $event_dir/add_mean_min_bg_removed.png -layers flatten $event_dir/flatten_colour.jpg
## Add caption to the composite colour image
convert -background "#000000ff" -fill white -pointsize 40 label:"$full_date_text: $half_interval_before_text - $half_interval_after_text" miff:- | composite -gravity south -geometry +0+50 - $event_dir/flatten_colour.jpg $event_dir/composite_colour_${date_text}_${event}.jpg
echo " "
echo -e "\e[101mCreating composite grey background image: composite_grey_${date_text}_${event}.jpg\e[0m"
#convert $event_dir/mean.jpg -colorspace gray +dither -remap ./pallete.png $event_dir/mean_grey.jpg
#convert $event_dir/mean.jpg +dither -colors 2 $event_dir/mean_grey.jpg
convert $event_dir/mean.jpg -colorspace gray -normalize $event_dir/mean_grey.jpg
convert $event_dir/mean_grey.jpg $event_dir/add_mean_min_bg_removed.png -layers flatten $event_dir/flatten_grey.jpg
#convert ./background.jpg $event_dir/add_mean_min_bg_removed.png -layers flatten $event_dir/flatten.jpg
## Add caption to the composite grey background image
convert -background "#000000ff" -fill white -pointsize 40 label:"$full_date_text: $half_interval_before_text - $half_interval_after_text" miff:- | composite -gravity south -geometry +0+50 - $event_dir/flatten_grey.jpg $event_dir/composite_grey_${date_text}_${event}.jpg
rm $event_dir/flatten_grey.jpg
rm $event_dir/flatten_colour.jpg
rm $event_dir/mean_grey.jpg
rm $event_dir/mean.jpg
rm $event_dir/add_mean_min_bg_removed.png
rm $event_dir/add_mean_min.jpg
rm $event_dir/sub_mean_max.jpg
rm $event_dir/composite_min_${date_text}_${event}.jpg
rm $event_dir/composite_max_${date_text}_${event}.jpg
echo " "
event_count=$(expr $event_count - 1)
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment