LMDE2 (Linux Mint) に Easystroke を入れました

LMDE2 (Linux Mint Debian Edition) に、X 上でマウスジェスチャを実現する Easystroke を入れました。

Ubuntu では公式リポジトリに登録されているので APT で入りますが、LMDE、Linux Mint、Debian などはありません。なので、公式を参考に自分でビルドします。

準備

次のコマンドで必要なものを入れます。

sudo apt-get install g++ libboost-serialization-dev libgtkmm-3.0-dev libxtst-dev libdbus-glib-1-dev intltool xserver-xorg-dev

clone と make

github.com から clone してきて、 make します。 ./configure は必要ありません。

git clone git@github.com:thjaeger/easystroke.git
cd easystroke
make

git を入れていない場合は、

wget https://github.com/thjaeger/easystroke/archive/master.zip
unzip master.zip

でも良いと思います。

make install

ビルドが通ったらインストール。

$ sudo make install
install -Ds easystroke /usr/local/bin/easystroke
install -D -m 644 easystroke.svg /usr/local/share/icons/hicolor/scalable/apps/easystroke.svg
install -D -m 644 easystroke.desktop /usr/local/share/applications/easystroke.desktop
for f in po/cs/LC_MESSAGES/easystroke.mo po/he/LC_MESSAGES/easystroke.mo po/zh_CN/LC_MESSAGES/easystroke.mo po/de/LC_MESSAGES/easystroke.mo po/ja/LC_MESSAGES/easystroke.mo po/ca/LC_MESSAGES/easystroke.mo po/hu/LC_MESSAGES/easystroke.mo po/pl/LC_MESSAGES/easystroke.mo po/it/LC_MESSAGES/easystroke.mo po/ru/LC_MESSAGES/easystroke.mo po/zh_TW/LC_MESSAGES/easystroke.mo po/el/LC_MESSAGES/easystroke.mo po/ko/LC_MESSAGES/easystroke.mo po/vi/LC_MESSAGES/easystroke.mo po/es/LC_MESSAGES/easystroke.mo po/fi/LC_MESSAGES/easystroke.mo po/fr/LC_MESSAGES/easystroke.mo; do \
install -D -m 644 $f `echo $f | sed "s|^po/|/usr/local/share/locale/|"`; \
done

上記のようなファイルが入っていきました。

実行

インストールが終わったら早速実行。

easystroke

とコマンドを打つと、設定画面が表示されます。

「アプリケーションを追加」を押すと、xkill のようにカーソルが十字になって、設定したいアプリケーションの画面をクリックすることによって指定できます。

LMDE cinnamon の標準ファイラである nemo にジェスチャを登録した様子です。私の環境だけかもしれませんが、最初にジェスチャ・ボタンが「ボタン 2」(つまり中ボタン)になっていてちょっと迷いましたが、「設定」の「動作」にある「ジェスチャ・ボタン」で右ボタンに変更することができました。

また、Google Chrome や Firefox など、それぞれでジェスチャを行なっているアプリと干渉させたくない場合は、「高度設定」の「動作」の

Only enable easystroke for applications listed on ‘Actions’ tab

にチェックを入れておけば、Easystroke で設定したアプリ内だけで有効になります。

あとは、お好みで「トレイアイコンを表示」「Easystroke を自動起動」などを有効にしておくと快適に使えます。

参考

Linux で Kinect と RTAB-Map を使ってみました

前回の記事の後半、RTAB-Mapfreenect2 が使えない…と四苦八苦していましたが、そもそも今回購入した Microsoft XBox 360 Kinect センサーは v1 と呼ばれる古いものでした。なので、v2 用の freenect2 で動かなくて当然という…!なんということでしょう… (:3っ )っ

RTAB-Map でスキャン

その事実に深夜に気付いて RTAB-Map のメニューから freenect を有効にして使ってみると…

ちゃんと理想通りのスキャンができました!

ちゃんと Kinect 自身の位置も情報として取得できているようで面白いですねー。スキャンしながらリアルタイムで位置合わせをしているのも興味深いです。(でも精度はそこそこ) スキャン後に改めて「Post processing」で自動位置合わせ処理を施すこともできるようです。

RTAB-Map から PCD 形式で出力し、pcl_viewer で表示した動画を置いておきます。

中古で5000円(うちケーブル代が3000円くらい)にしてはよく撮れているんじゃないでしょうか。

下記は Cloud Compare でノイズ除去、セグメンテーション調整(点群を切ったり貼ったり)、SSAO フィルタを有効にしてみた状態のスクリーンショットです。

近付いてみなければそれっぽい!

Lenovo の赤外線深度計付きスマホ

そういえば、

GoogleのAR技術Tangoに世界初対応のスマホ「Phab 2 Pro」がついに日本発売 – GIGAZINE

という記事も出ていることですし、もっとポイントクラウド関連が賑っていけばいいですね! 早速、RTAB-Map と連携させて空間スキャンしてる方がいらっしゃいました。

もはや v2 買うわ!

せっかく kinect v2 用の freenect2 をビルドして組み込んだので、

コイツを新品で注文してしまいました。TOF方式になって精度も(ホストの要求スペックも)上がっているらしいので楽しみ!

参考

Linux で Microsoft Xbox 360 Kinect センサーを使ってみました

昨日、Amazon で中古で売ってあったMicrosoft Xbox 360 Kinect センサーが届いたので、早速 Linux で使ってみました。

環境

OS は Linux Mint の Debian Edition です(略して LMDE )。 Ubuntu などの Debian 系の Linux なら同じ手順でいけるかもしれません。

使いそうなものをインストール

とりあえず APT の公式リポジトリで freenectオープンソース版の Kinect ライブラリ)で検索すると libfreenect-bin というパッケージがあったのでインストール。

sudo aptitude install libfreenect-bin

コマンドがいくつか追加されました。

$ sudo dpkg -L libfreenect-bin
--- snip ---
/usr/bin/freenect-cppview
/usr/bin/freenect-glpclview
/usr/bin/freenect-glview
/usr/bin/fakenect
/usr/bin/fakenect-record
--- snip ---

Kinect を接続

Kinect の電源を入れて、USB でホストと接続します。 dmesg の様子は次のとおり。

$ dmesg
[1969221.943934] usb 1-7.2.2: new full-speed USB device number 98 using xhci_hcd
[1969222.056332] usb 1-7.2.2: New USB device found, idVendor=045e, idProduct=02b0
[1969222.056334] usb 1-7.2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[1969222.056336] usb 1-7.2.2: Product: Xbox NUI Motor
[1969222.056337] usb 1-7.2.2: Manufacturer: Microsoft
[1969261.058907] usb 1-7.2.1: new high-speed USB device number 99 using xhci_hcd
[1969261.164501] usb 1-7.2.1: New USB device found, idVendor=045e, idProduct=02ad
[1969261.164503] usb 1-7.2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[1969261.164504] usb 1-7.2.1: Product: Xbox Kinect Audio, © 2011 Microsoft Corporation. All rights reserved.
[1969261.164505] usb 1-7.2.1: Manufacturer: Microsoft
[1969261.164505] usb 1-7.2.1: SerialNumber: ****************
[1969262.592523] usb 1-7.2.3: new high-speed USB device number 100 using xhci_hcd
[1969262.699765] usb 1-7.2.3: New USB device found, idVendor=045e, idProduct=02ae
[1969262.699766] usb 1-7.2.3: New USB device strings: Mfr=2, Product=1, SerialNumber=3
[1969262.699768] usb 1-7.2.3: Product: Xbox NUI Camera
[1969262.699768] usb 1-7.2.3: Manufacturer: Microsoft
[1969262.699769] usb 1-7.2.3: SerialNumber: ****************
[1969263.711841] gspca_main: v2.14.0 registered
[1969263.712338] gspca_main: kinect-2.14.0 probing 045e:02ae
[1969263.712389] usbcore: registered new interface driver kinect
[1969716.950137] gspca_main: kinect-2.14.0 probing 045e:02ae

freenect コマンドを実行

なんだかそのまま認識しているみたいですね!追加されたコマンドを実行してみます。

freenect-glview

ウィンドウが表示され、左に深度マップ、右に可視光線カメラ映像が表示されます。

上は左の部分だけのキャプチャです。意外にもすんなりと深度が出てますね! さすがにハードウェアで処理していることもあり、動きも滑らかです。

次に PCL (Point Cloud Library) を使ってるっぽいコマンドを実行してみます。

freenect-glpclview

リアルタイムに点群化されたものが見れました。これは楽しい…。

2016年までの記事では ROS 関係のパッケージを入れている方が多いようですが、今はなくてもいいのかな。

RTAB-Map を導入

ここまで拍子抜けするほど順調だったので、調子に乗って部屋のスキャンをしてみるべく、RTAB-Map を導入しようとしました。流れとしては

  1. RTAB-Map は Debian (というかLMDE) の公式リポジトリにないのでソースコードからビルド
  2. Kinect が認識されない、メニューから選べない。→ freenect2 (v2 ベースのライブラリ)が必要。
  3. freenect2 もリポジトリにないのでソースコードからビルド → いろいろとライブラリを追加してみるが cmake . で LibUSB_LIBRARY がないとかで失敗。
  4. どうも libusb のバージョンが公式リポにある最新の 1.0.19 ではなく 1.0.20 以降が必要な模様。
  5. freenect の作者?の人が PPA に deb な libusb v1.0.20 置いてるよー/(^o^)\ → Ubuntu じゃねえええ \(^o^)/
  6. Debian 環境(LMDEだってば)で PPA リポを追加するも 404 Not found…Dockerまわりもあるので source.list 汚したくないので深追いは禁物。
  7. もうこうなると libusb の 1.0.20 をコードからビルドするか…!
  8. sudo aptitude purge libusb-1.0-0-dev → sudo aptitude install libudev-dev → ./configure → make → sudo make install。/usr/local/lib に入っていった…、まあいいや。
  9. freenect2 の cmake . が通らない!調べたら libGL.so のリンク切れしてる場合があるらしい→切れてた→ ln し直し。
  10. ビルド通った!もう面倒なのでついでに freenect2.so も sudo make install。これも /usr/local/lib に…まあいいか。
  11. RTAB-Map の再ビルド。freenect2 が YES になってる!ビルド通った…!
  12. わくてかしながら bin/rtabmap を実行→freenect2 が有効になってる!キャプチャ開始…………
  13. CameraFreenect2: no device connected or failure opening the default one! Note that rtabmap should link on libusb of libfreenect2. Tip, before starting rtabmap: "$ export LD_LIBRARY_PATH=~/libfreenect2/depends/libusb/lib:$LD_LIBRARY_PATH" と出てカメラ初期化失敗。
  14. あかん(あかん) ldconfig -p してもちゃんと freenect2.so は見えてるし、これは何なんだー。
  15. /usr/lib/x86_64-linux-gnu/ 配下に(多分)古い libusb と思われるものを発見、移動したのち sudo ldconfig
  16. RTAB-Map を cmake からやり直し、状況変わらず。

ていうかそもそもハードが v2 に対応してないパターンじゃ…よ、よし寝よう (:3っ )っ

freenect2 が入っていった場所

$ sudo make install
[  3%] Built target generate_resources_tool
[ 89%] Built target freenect2
[100%] Built target Protonect
Linking CXX shared library CMakeFiles/CMakeRelink.dir/libfreenect2.so
Install the project...
-- Install configuration: "RelWithDebInfo"
-- Installing: /usr/local/lib/libfreenect2.so.0.2.0
-- Installing: /usr/local/lib/libfreenect2.so.0.2
-- Installing: /usr/local/lib/libfreenect2.so
-- Installing: /usr/local/include/libfreenect2
-- Installing: /usr/local/include/libfreenect2/frame_listener_impl.h
-- Installing: /usr/local/include/libfreenect2/frame_listener.hpp
-- Installing: /usr/local/include/libfreenect2/registration.h
-- Installing: /usr/local/include/libfreenect2/logger.h
-- Installing: /usr/local/include/libfreenect2/packet_pipeline.h
-- Installing: /usr/local/include/libfreenect2/libfreenect2.hpp
-- Installing: /usr/local/include/libfreenect2
-- Installing: /usr/local/include/libfreenect2/export.h
-- Installing: /usr/local/include/libfreenect2/config.h
-- Installing: /usr/local/lib/cmake/freenect2/freenect2Config.cmake
-- Installing: /usr/local/lib/pkgconfig/freenect2.pc

自前ビルドの libusb が入っていった場所

$ sudo make install 
Making install in libusb
make[1]: Entering directory '/tmp/libusb-1.0.20/libusb'
make[2]: Entering directory '/tmp/libusb-1.0.20/libusb'
make[3]: Entering directory '/tmp/libusb-1.0.20/libusb'
 /bin/mkdir -p '/usr/local/lib'
 /bin/bash ../libtool   --mode=install /usr/bin/install -c   libusb-1.0.la '/usr/local/lib'
libtool: install: /usr/bin/install -c .libs/libusb-1.0.so.0.1.0 /usr/local/lib/libusb-1.0.so.0.1.0
libtool: install: (cd /usr/local/lib && { ln -s -f libusb-1.0.so.0.1.0 libusb-1.0.so.0 || { rm -f libusb-1.0.so.0 && ln -s libusb-1.0.so.0.1.0 libusb-1.0.so.0; }; })
libtool: install: (cd /usr/local/lib && { ln -s -f libusb-1.0.so.0.1.0 libusb-1.0.so || { rm -f libusb-1.0.so && ln -s libusb-1.0.so.0.1.0 libusb-1.0.so; }; })
libtool: install: /usr/bin/install -c .libs/libusb-1.0.lai /usr/local/lib/libusb-1.0.la
libtool: install: /usr/bin/install -c .libs/libusb-1.0.a /usr/local/lib/libusb-1.0.a
libtool: install: chmod 644 /usr/local/lib/libusb-1.0.a
libtool: install: ranlib /usr/local/lib/libusb-1.0.a
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/sbin" ldconfig -n /usr/local/lib
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/local/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
 /bin/mkdir -p '/usr/local/include/libusb-1.0'
 /usr/bin/install -c -m 644 libusb.h '/usr/local/include/libusb-1.0'
make[3]: Leaving directory '/tmp/libusb-1.0.20/libusb'
make[2]: Leaving directory '/tmp/libusb-1.0.20/libusb'
make[1]: Leaving directory '/tmp/libusb-1.0.20/libusb'
Making install in doc
make[1]: Entering directory '/tmp/libusb-1.0.20/doc'
make[2]: Entering directory '/tmp/libusb-1.0.20/doc'
make[2]: Nothing to be done for 'install-exec-am'.
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/tmp/libusb-1.0.20/doc'
make[1]: Leaving directory '/tmp/libusb-1.0.20/doc'
make[1]: Entering directory '/tmp/libusb-1.0.20'
make[2]: Entering directory '/tmp/libusb-1.0.20'
make[2]: Nothing to be done for 'install-exec-am'.
 /bin/mkdir -p '/usr/local/lib/pkgconfig'
 /usr/bin/install -c -m 644 libusb-1.0.pc '/usr/local/lib/pkgconfig'
make[2]: Leaving directory '/tmp/libusb-1.0.20'
make[1]: Leaving directory '/tmp/libusb-1.0.20'

参考

3/26メモ

heroku

わかりやすい。

heroku 上で Rails アプリが動くところまでざっと見てみました。てか、heroku の前にまともに Rails の勉強しなきゃ。

ほほう。

vagrant

上の heroku の動画で vagrant を使っていて、docker や virtualbox はコマンドラインからガリガリ使っていたけど、vagrant は名前くらいしか知らなかったのでちょっとメモしておく。

うんうん、virtualbox のイメージも空から降ってくるべきですよね。

swig

sirenmruby から MRI に移植してるんだけど、どうせなら SWIG で OpenCASCADE ラッパーな ruby-occt を作ってゴニョゴニョすべきかなと思いつつ

を見てたんだけど、PythonOCC では大量の SWIG 用ラッパーファイルで頑張ってらっしゃる。*.i だけなら流用できるのかなー、でも python なんちゃらって文字があるぞ。めんどいなあ…。そもそも siren は OCCT の無駄に多いクラスや機能を適度にまとめて使えることが利点だから、フル機能の OCCT を使いたいんだったら PythonOCC やネイティブな OpenCASCADE を使えばいいと思ってたりして悩みどころです。

Kinect 360 買っちゃった

前々回と前回の OpenCV まわりに関連して、とうとう Kinect を購入しました。Kinect for Windows じゃなく 360 でもとりあえずは研究に使えるらしいし、ドライバや SDK が厳格そうな Windows で開発するわけでもない、360なら価格も中古で低価格程度ということで Amazon で5000円の中古をポチ。ヤフオクで2000円弱で出品されてるんですが、動作保証と電源ケーブル同梱版、手続きの早さで割高だけど Amazon のを購入しました。

月曜日(明日)届く予定です。楽しみ。Kinect の到着を待つ間、Python で書いていた(というかコピペしてた)ステレオマッチング処理を Ruby で書き直そうと思ってドキュメントを見てたら ruby-opencv には StereoSGBM()ない模様

こんな時に颯爽と実装してプルリクをぶん投げられる人になりたい…。

デジタルデバイス処分

PS3、楽天 KOBO、NEC LifeTouch NOTE、Lavie Tab W 708 など使ってないデバイスを処分中。ハンディカムや液タブも売り出そうか悩み中です。

OpenCVでステレオマッチング(ステレオカメラ)

前日より引き続き、OpenCV でステレオ画像による深度計算をやっています。 昨晩、スマホの単眼カメラで撮影した2枚のステレオ画像の深度計算で割と良さそうな結果が出たので、Amazonで安いWebカメラを二つ注文。早速届いたので遊んでみます。

環境

  • LMDE2 64bit
  • OpenCV2
  • Python2.7

カメラ

ロジクールの安いWebカメラを2台購入。購入時には1台1081円でした。田舎でも前日の深夜に注文した商品が翌日午後には届くのって素晴しすぎますね!引きこもって生きてゆけそう… _(:3」∠)_

こんな感じで、ディスプレイの上に二つならべて設置しました。Webカメラは可動域が多いので直線状に並べて2つのレンズに角度がつかないようにするのが大変でした。

スクリプト

カメラを2台使用するので、昨晩のスクリプトは使わず、下記のページを参考にしました。

試行錯誤な日々: openCVを利用したステレオカメラの作り方

動画

思っていたよりも滑らかなグラデーションがついていませんが、リアルタイムで処理できるのは楽しいですね。 もうちょっとパラメータの調整が必要なのかな。

OpenCVでステレオマッチング

かなりの今更感はさておき、OpenCV でステレオ画像による深度計算をやっています。

環境

  • LMDE2 64bit
  • OpenCV2
  • Python2.7

スクリプト

入力画像と深度計算の結果

cv2.StereoSGBM() のパラメータをいじくり回したり、単眼のスマホカメラで撮影した入力画像の位置合わせをしたりしていると、それなりに深度が出るようになりました。

PCD 化

PCL(Point Cloud Library)のフォーマットである PCD 形式に変換し、pcl_viewer で確認します。

スクリプトのPCD化部分次のとおり。


pcl_viewer で開いたところ。

数百万円するレーザー計測器には到底及ばないものの、それなりにカラーボックスやその上に置いている箱の形状が出てますね! もっとフワフワな点群になるかと思っていたので、ちょっと予想外でした。

参考

Ruby と OpenCV でカメラを使う

前回に引き続き、ruby-opencv でカメラデバイスをソースにしてリアルタイム検知をやってみたいと思います。

使っているカメラ

Microsoft 社製の USB 接続 HD ウェブカムです。エンドユーザ向けにしてはちょっと高めですが画質も良いです。LMDE2 では UVC で使えています。

コード

カメラデバイスを使うには OpenCV::CvCapture.open() メソッドを使います。引数の番号はデバイス番号。対象のデバイスが /dev/video0 だったら 0 を指定すれば良いようです。

camera.rb

#!/usr/bin/env ruby

require 'opencv'
include OpenCV

camera = CvCapture.open(0)
camera.width = 320
camera.height = 240

window = GUI::Window.new('camera')
pattern_size = CvSize.new(7, 10)

while true

  image = camera.query
  gray = image.BGR2GRAY
  corners, found = gray.find_chessboard_corners(pattern_size, CV_CALIB_CB_ADAPTIVE_THRESH)

  if found
    corners = gray.find_corner_sub_pix(corners, CvSize.new(3, 3), CvSize.new(-1, -1), CvTermCriteria.new(20, 0.03))
    result = image.draw_chessboard_corners(pattern_size, corners, found)
    window.show result
  else
    window.show image
  end

  key = GUI::wait_key 100
  break if key == 'q'
end

CvCapture#query() メソッドで取得すると IplImage オブジェクトが返ってくるので、あとは前回と同様にチェッカーボード検知・描画を行なっているだけです。タイムアウト付きのキー入力待ち GUI::wait_key() で 100 ミリ秒待って、 Q キーが押下されなければ繰り返します。

実行

ruby camera.rb

実行するとこんな感じ↓

画面がちらついているのは、GTK recordMyDesktop で Cinnamon 上のウィンドウを撮影しているせいだと思います。 検知している時より、してない時の方がフレームレートが落ちてる気がするのはなぜだろう…。

Ruby と OpenCV でチェッカーボード検知

前日に引き続き、ruby-opencv でチェッカーボードを認識させてみたいと思います。チェッカーボードとは市松模様のパターンのことで、これを認識することにより映像中の3次元座標系(の行列)を確定させることができ、映像の上に3Dモデルをマッピングする第一歩となります。

1. コード

checkerboard.rb

#!/usr/bin/ruby

require 'opencv'
include OpenCV

if ARGV.size < 1
  STDERR.puts "#{$0} srcfile [destfile]"
  exit 1
end
src = ARGV.shift
dest = nil
if ARGV.size >= 1
  dest = ARGV.shift
end

mat = CvMat.load(src, 1)
gray = mat.BGR2GRAY
pattern_size = CvSize.new(7, 10)
corners, found = gray.find_chessboard_corners(pattern_size, CV_CALIB_CB_ADAPTIVE_THRESH)

if found
  puts "found"
  corners = gray.find_corner_sub_pix(corners, CvSize.new(3, 3), CvSize.new(-1, -1), CvTermCriteria.new(20, 0.03))
end

img = mat.draw_chessboard_corners(pattern_size, corners, found)

if dest
  img.save dest
else
  w = GUI::Window.new('Result')
  w.show img
  GUI::wait_key
end

映像をグレイスケールイメージに変換してから、 find_chessboard_corners でチェスボードを検知します。チェスボードのパターンはここと同じく 7×10 サイズのものでやってみました。

2. 実行

ruby checkerboard.rb src.jpg dest.jpg

とタイプして実行すると、

のように、ちゃんとパターンを認識できています。カメラから遠ざけると

のように検出した点に沿って線が出てきます。ここで検知した点列と各々の2次元座標値から3次元座標系を逆算していき…たいところですが、また次回です。

あ、部屋が汚いのは見ないでください… _(┐「ε:)_

Ruby と OpenCV で顔認識

去年の秋に組んだ新しいメインマシンは、MSI のB150M MORTAR ARCTIC (MS-7A45) という新しいマザボで、LMDE2 x64 を乗せて使おうとすると USB デバイスまわりが突然使用不能になったりして厄介でした。

USB デバイスの抜き差し時にホストコントローラが全部死ぬという惨事。PS/2キーボードもマウスもインターフェイスがないので、USB接続なんですが、それも使えなくなっちゃいます。何度かネットワーク経由でログインして再起動してました。Linux カーネル 4.x 系では USB デバイス関連のモジュールが充実していたようですが、なかなか時間が取れずに騙し騙し使っていました。ここ数ヶ月の LMDE のアップデートで同様の症状はなくなったみたいなので、ようやくメインマシンにカメラなどの USB デバイスを差して遊んでいます。ビバ他力本願。

仕事で上司が「ARをやってみたいな~」と言っていたので、久々に OpenCV を触ってみようと思い、今更感はあるものの Ruby で顔認識をやってみました。 OpenCV は2013年2月に Python でスネークさんのフィギュアの顔認識をして遊んだ程度…今度はちゃんと長続きするかな!

以下、自分用のメモです。

環境

  • LMDE2 (Linux Mint Debian Edition) x64
  • Ruby 2.1.0
  • ruby-opencv 0.0.7

1. ライブラリのインストール

sudo gem install opencv

2. 顔認識用の定義ファイルのダウンロード

wget https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_alt.xml

3. コード

ほぼサンプルのままです。認識した部分に赤い枠線を描いて保存します。

facedetect.rb

#!/usr/bin/ruby

require 'opencv'
include OpenCV

if ARGV.size < 2
  STDERR.puts "Usage: #{$0} srcfile destdest"
  exit 1
end

src = ARGV.shift
dest = ARGV.shift

img = IplImage::load src
d = CvHaarClassifierCascade::load "./haarcascade_frontalface_default.xml"

d.detect_objects(img).each do |r|
  img.rectangle! r.top_left, r.bottom_right, :color => CvColor::Red, :thickness => 3
end

img.save dest

4. 実行

ruby facedetect.rb srcfile.jpg destfile.jpg

動きました!

変なところを認識してるけれど、まずはひと安心 _(:3」∠)_