Histogram-based classification
06 Apr 2011Here is a small presentation showing histogram-based classification with Ruby.
Here is the program to capture the reference pictures
#!/usr/bin/env ruby
require 'rubygems'
require 'hornetseye_v4l2'
require 'hornetseye_rmagick'
require 'hornetseye_xorg'
include Hornetseye
BOX = [220 ... 420, 140 ... 340]
input = V4L2Input.new
mask = MultiArray.bool(640, 480).fill!
mask[*BOX] = true
labels = ['reference', 'dragon', 'knight', 'camel']
labels.each do |label|
X11Display.show(:title => label.capitalize) do
img = input.read_ubytergb
mask.conditional img, img >> 1
end[*BOX].save_ubytergb "#{label}.jpg"
end
The program for live classification is shown below
#!/usr/bin/env ruby
require 'rubygems'
require 'hornetseye_v4l2'
require 'hornetseye_rmagick'
require 'hornetseye_xorg'
include Hornetseye
PI = Math::PI
RAD = 2.0 * PI
VAL = 117.0
HBINS = 8
CBINS = 8
THRESHOLD = 32
N = 5
BOX = [220 ... 420, 140 ... 340]
class Node
def hsv_hist(hbins = HBINS, cbins = CBINS)
alpha = 2 * r.to_sint - g - b
beta = Math.sqrt(3) / 2 * ( g.to_sint - b )
h = ( (Math.atan2(beta, alpha) + PI) * (HBINS / RAD) ).to_int.clip 0 .. HBINS - 1
c = ( Math.sqrt(alpha ** 2 + beta ** 2) * (CBINS / VAL) ).to_int.clip 0 .. CBINS - 1
[h, c].histogram(hbins, cbins).to_int
end
def cmp(other)
(self - other).abs / (self + other).major(1.0)
end
end
input = V4L2Input.new
mask = MultiArray.bool(640, 480).fill!
mask[*BOX] = true
labels = ['reference', 'dragon', 'knight', 'camel']
hists = labels.collect do |object|
MultiArray.load_ubytergb("#{object}.jpg").hsv_hist
end
history = ['reference'] * N
X11Display.show do
img = input.read_ubytergb
img_hist = img[*BOX].hsv_hist
similarities = hists.collect { |hist| img_hist.cmp(hist).abs.sum }
label = labels[similarities.index(similarities.min)]
history = [label] + history[0 ... N - 1]
if history == [label] * N
system "echo '#{label}' | festival --tts" if label != 'reference'
end
history != ['reference'] * N ? mask.conditional(img, img >> 1) : img
end
And here is a demonstration video of the two programs