ネットワークカメラの画像を監視
研究室のOB降臨システムのカメラの画像をhttpで取得できるので、監視したい
imagemagick付属のconpositeとidentifyコマンドが必要
参考:2枚の画像のdiff(差分)を超簡単に調べる方法 - 床のトルストイ、ゲイとするとのこと
img_watch.rb
#!/usr/bin/env ruby require 'rubygems' require 'open-uri' require 'ArgsParser' parser = ArgsParser.parser parser.bind(:image, :i, 'image path or URL') parser.comment(:delay, 'watch delay', 5) parser.comment(:tmp_dir, 'tmp dir', '/var/tmp/imgdiff') parser.bind(:help, :h, 'show help') first, params = parser.parse(ARGV) if parser.has_option(:help) or !parser.has_param(:image) puts parser.help exit 1 end params[:tmp_dir].gsub!(/\/$/,'') Dir.mkdir params[:tmp_dir] unless File.exists? params[:tmp_dir] out_name_p = nil loop do out_name = params[:tmp_dir]+"/#{Time.now.to_i}_#{Time.now.usec}" begin open(params[:image]){|img| open(out_name,'w+'){|out| out.write(img.read) } } rescue => e STDERR.puts e next rescue Timeout::Error => e STDERR.ptus e next end puts "saved => #{out_name}" if out_name_p != nil `composite -compose difference #{out_name} #{out_name_p} #{params[:tmp_dir]}/diff` puts diff = `identify -format "%[mean]" #{params[:tmp_dir]}/diff` File.delete out_name_p end out_name_p = out_name sleep params[:delay] end
こんな感じで実行すると5秒間隔で監視する
ruby img_watch.rb -i http://example.com/img.jpg -delay 5
大きく変化があった時は10000以上の値がでる
saved => /var/tmp/imgdiff/1308836364_689802 saved => /var/tmp/imgdiff/1308836370_59108 824.838 saved => /var/tmp/imgdiff/1308836375_318580 1136.14 saved => /var/tmp/imgdiff/1308836380_726220 1077.58 saved => /var/tmp/imgdiff/1308836386_123862 1204.8 saved => /var/tmp/imgdiff/1308836391_526824 815.697 saved => /var/tmp/imgdiff/1308836396_922031 829.736 saved => /var/tmp/imgdiff/1308836402_336087 12987.4 saved => /var/tmp/imgdiff/1308836407_731595 5957.86 saved => /var/tmp/imgdiff/1308836413_159222 1761.5 saved => /var/tmp/imgdiff/1308836418_553641 1116.94 saved => /var/tmp/imgdiff/1308836423_958055 1189.95 saved => /var/tmp/imgdiff/1308836429_357417 1141.75