lib/yearbook/image.rb in yearbook-0.1.0 vs lib/yearbook/image.rb in yearbook-0.2.0

- old
+ new

@@ -1,63 +1,97 @@ require 'rmagick' require 'hashie' +require_relative 'att_hash' +require_relative 'classifier' -require 'delegate' -class AttHash < SimpleDelegator - def initialize - @hsh = {} - super(@hsh) - end +module Yearbook + class Image - def method_missing(foo, *args, &blk) - if @hsh.respond_to?(foo) - @hsh.send(foo, *args, &blk) - else - @hsh[foo.to_sym] = args + attr_reader :filename + def initialize(fname) + @filename = fname + @objects = [] end - end -end + def detect_objects(obj_type) + @objects = Classifier.detect_objects(cv_object, obj_type).to_a + end -module Yearbook - class Image + def detect_faces + detect_objects(:faces) + end - def initialize(fname) - @magick_image = read_magick_image(fname) + def detected_objects + @objects end - - def write(out_fname, &blk) + def write(base_out_fname, &blk) klass = self.class - image_out = image_object - if block_given? - h = AttHash.new - yield h + if @objects.empty? + img_objects = Array(image_object) + else + img_objects = @objects.map{|o| constitute_from_cv(o, image_object)} + end - - image_out = h.inject(image_out) do |img, (foo, args)| - klass.send(foo, img, *args) + img_objects.each_with_index do |image_out, idx| + if block_given? + h = AttHash.new + yield h + + # transform the image + image_out = h.inject(image_out) do |img, (foo, args)| + klass.send(foo, img, *args) + end end - end - klass.output(image_out, out_fname) + if idx == 0 + out_fname = base_out_fname + else + out_fname = base_out_fname.sub(/\.(?=\w+$)/, "-#{idx}.") + end + + klass.output(image_out, out_fname) + end end + + + private - def read_magick_image(fname) - Magick::Image::read(fname).first - end + + # defer loading until it is needed def image_object - @magick_image + @magick_image ||= load_magick_image(@filename) end + def cv_object + @cv_image ||= load_cv_image(@filename) + end + + + + def constitute_from_cv(c, img) + pixels = img.dispatch(c.x, c.y, c.width, c.height, "RGB") + + return Magick::Image.constitute(c.width, c.height, "RGB", pixels) + end + + + def load_magick_image(fname) + Magick::Image::read(fname).first + end + + + def load_cv_image(fname) + IplImage::load(fname) + end # Image manipulation methods at the class level # no reason for them to be instance methods class << self \ No newline at end of file