ネットワークカメラの画像を監視

研究室の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