[mac][ruby]OpenCVを使って顔認識する


昨日の記事ではCentOSにOpenCVをインストールしましたが、カメラが使えるmacで試そうと思い設定とデモを作成しました。

macのカメラに写った顔の目の部分にモザイクがかかるようにしてみました。

  • homebrewでOpenCVのインストール
brew doctor
brew update
brew tap homebrew/science
brew install opencv
  • ruby-opencvのインストール
gem install ruby-opencv -- --with-opencv=dir=/usr/local/Cellar/opencv/
  • サンプル作成

参考記事にあったサンプルコードをお借りして、少し改造して目の部分にモザイクがかかるようにしてみました。

# camera.rb
 
require 'opencv'
include OpenCV

MOSAIC_SIZE = 10

def mosaic(img, rect, size)
  Range.new(rect.y, rect.y+rect.height).step(size) do |y|
    Range.new(rect.x, rect.x+rect.width).step(size) do |x|
      w = h = size
      w = (img.width - x) if x+size > img.width
      h = (img.height - y) if y+size > img.height
      topleft = CvPoint.new(x, y)
      bottomright = CvPoint.new(x+w, y+h)
      avg = img.sub_rect(topleft, CvSize.new(w, h)).avg
      img.rectangle!(topleft, bottomright, :color => avg, :thickness => -1)
    end
  end
end

camera = CvCapture.open(0)
eye = CvHaarClassifierCascade::load('/usr/local/Cellar/opencv/2.4.7.1/share/OpenCV/haarcascades/haarcascade_eye.xml')
size = CvSize.new(320, 240)

window = GUI::Window.new('camera')

while GUI::wait_key(50).nil?
  image = camera.query
  image = image.resize(size)
  eye.detect_objects(image) {|rect_eye|
    mosaic(image, rect_eye, MOSAIC_SIZE)
  }
  window.show image
end

window.destroy
  • サンプル実行

macのカメラが立ち上がるので、顔を近づけると目にモザイクがかかります。

mosaic

画像処理はこれまであまり触れてこなかったので色々よくわかっていないですが、フィルターを色々組み合わせて変なもの作ってみたいと思いました。

ちゃんと理解して使えるようになりたいです。

MediaAmbitionTokyo に展示されていた「扇情的な鏡」も同じような仕組みで実装されているのでしょうか。

rubyから手軽にOpenCVをいじれるのは楽しいですね。

参考