hello-world
webエンジニアのメモ。とりあえずやってみる。

[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をいじれるのは楽しいですね。

参考


Related #mac

[mac]FinderでMarkdown(md)形式のファイルをプレビューしたい

QuickLookを使うとアプリを起動しなくてもファイルの内容をプレビューできるので「テキストファイルの内容をちょっと見たい」といった時に非常に便利です。

[mac]iPadをサブディスプレイ化するDuet Displayを使おうとしたら初期設定にハマった話

iPad外部ディスプレイ化の新本命「Duet Display」公開 : ギズモード・ジャパン

[Mac]『入門Chef Solo』を読んで試してみた

伊藤直也さんの『 入門Chef Solo』を読んで、実際にVagrantを使って試してみた。

[mac]Karabinerでキーボード設定を便利にする(キーリピート、USキーボードの日本語切り替え)

以前は「KeyRemap4MacBook」という名前でしたがいつの間にか「Karabiner」に名前が変わっていました。