Last Updated or created 2022-10-01
Last year i made a script for a friend who wanted to detect visually if his garden sprinkler was on or off. A few days ago i saw someone who wanted to see if things where moving in his house. (didn’t trust his landlord i think)
But he only had a dumb/simple/cheap camera .. so it had no motion detection.
I was thinking of my script, and could easily adapt it for this usage.
Most ipcams have somekind of URL/API you can use to capture a image.
Some examples below
# Reolink wget "http://ipnumber/cgi-bin/api.cgi?cmd=Snap&channel=0&rs=randomstring&user=user&password=password" -O image.jpg # Foscam wget "http://ipnumber:88/CGIProxy.fcgi?cmd=snapPicture2&usr=user&pwd=password&cnt=randomstring" -O image.jpg # Edimax wget "http://user:password@ipnumber/jpg/image.jpg" -O image.jpg # Hikvision wget "http://user:password@ipnumber/ISAPI/Streaming/channels/101/picture" -O image.jpg
So using below script i can capture a image, compare it to the previous, and when it’s above a certain threshold sends a email.
#!/bin/bash # Only uses wget and image-magick treshhold=500 fuzzyness=20% # CHANGE WEBCAM THINGY TO OWN URL AND CREDENTIALS wget -q "http://webcamip/cgi-bin/api.cgi?cmd=Snap&channel=0&user=user&password=password" -O previous.jpg while true; do wget -q "http://webcamip/cgi-bin/api.cgi?cmd=Snap&channel=0&user=user&password=password" -O current.jpg value=$(compare -fuzz $fuzzyness previous.jpg current.jpg -metric mae diff.jpg 2>&1 | cut -f1 -d.) if [ $value -gt $treshhold ] ; then echo "ping $treshhold" echo "Something moved" | mail -s "Movement" firstname.lastname@example.org -A diff.jpg fi # Comment below if you want to compare against a base line .. not previous image cat current.jpg > previous.jpg sleep 60 done
Example previous picture
Example current picture
I got mailed with result
Use crop to detect only a part. copy current.jpg to a second file Use painting black a part and compair with different treshhold fuzzyness to get different hotspots. Below detects RED, use above ide with crop to detect red/green/blue leds compare -verbose -metric mae 1.jpg 2.jpg /tmp/1.diff 1.jpg JPEG 2560x1920 2560x1920+0+0 8-bit sRGB 248819B 0.050u 0:00.057 2.jpg JPEG 2560x1920 2560x1920+0+0 8-bit sRGB 248949B 0.030u 0:00.137 Image: 1.jpg Channel distortion: MAE Channel distortion: MAE red: 12517.5 (0.191005) green: 11967.1 (0.182607) blue: 12492.8 (0.190628) all: 12325.8 (0.18808) 1.jpg=>/tmp/1.diff JPEG 2560x1920 2560x1920+0+0 8-bit sRGB 1.19495MiB 1.470u 0:00.197