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を利用したステレオカメラの作り方 http://asukiaaa.blogspot.com/2016/07/opencv.html

動画

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

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 で使えています。

camera

コード

カメラデバイスを使うには 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 デバイスまわりが突然使用不能になったりして厄介でした。

B150M

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」∠)_