ruby-opencvをWindows(RubyInstaller)で使う

ruby-opencvは一応Windowsもサポートしているわけですが、いつからかOpenCVMinGW版のバイナリを配布しなくなってしまったため、RubyInstallerを使っている場合は自前でOpenCVをビルドしなければならない状態になっていました。 GitHubでもissueがいくつか挙がってたのをずーっと放置していたのですが、さすがに放置し過ぎな気がしてきたので、取り急ぎインストール用のドキュメントを作成しました。

ruby-opencv/install-ruby-opencv-with-rubyinstaller-on-windows.md at master · ruby-opencv/ruby-opencv · GitHub

大雑把に言うと、ポイントは以下の2点です。

  • DevKitのビルドツール(mingw-32-make、gcc、g++)を使ってOpenCVをビルドする
  • ruby-opencvをインストールしたり使ったりするときに、OpenCVのDLLのフォルダに加えてMinGWのDLLのフォルダをパスに追加する

想定環境 & 用意するもの

ちなみに、OpenCV 3系だとDevKitに含まれるgccとかg++が古すぎてビルドできません。DevKitアップデートされないかな…。

インストール方法

OpenCVを取ってくる

まずはOpenCVhttps://sourceforge.net/projects/opencvlibrary/ あたりから取ってきて、適当なフォルダに展開します。

CMakeでOpenCVMakefileを作成する

コマンドプロンプト(cmd.exe)を開き、下記のコマンドを実行します。

D:\>set DEVKIT_PATH=D:/local/devkit
D:\>set SOURCE_PATH=D:/work/opencv-2.4.13/sources
D:\>set OPENCV_INSTALL_PATH=D:/opencv-2.4.13
D:\>cmake %SOURCE_PATH% -G"MinGW Makefiles" -DCMAKE_INSTALL_PREFIX=%OPENCV_INSTALL_PATH% -DCMAKE_MAKE_PROGRAM=%DEVKIT_PATH%/mingw/bin/mingw32-make.exe -DCMAKE_C_COMPILER=%DEVKIT_PATH%/mingw/bin/gcc.exe -DCMAKE_CXX_COMPILER=%DEVKIT_PATH%/mingw/bin/g++.exe -DBUILD_PERF_TESTS=OFF

上記コマンドでは、DevKit が D:/local/devkit に、OpenCVD:/work/opencv-2.4.13 にインストールされていて(ソースコードD:/work/opencv-2.4.13/sources )、出力先フォルダが D:/opencv-2.4.13 になるという前提です。もし別のフォルダを指定する場合は、 DEVKIT_PATHSOURCE_PATHOPENCV_INSTALL_PATH で設定しているパスを変更してください。

なお、 D:\>コマンドプロンプトのプロンプトなので、入力しなくてよいです。

OpenCVをDevKitでビルドする

コマンドプロンプトで下記のコマンドを実行します。

D:\>%DEVKIT_PATH%/mingw/bin/mingw32-make.exe
D:\>%DEVKIT_PATH%/mingw/bin/mingw32-make.exe install

ruby-opencvをインストール

コマンドプロンプトで下記のコマンドを実行します。

D:\>path %OPENCV_INSTALL_PATH%\x64\mingw\bin;%DEVKIT_PATH%\mingw\bin;%PATH%
D:\>gem install ruby-opencv -- --with-opencv-include=%OPENCV_INSTALL_PATH%/include --with-opencv-lib=%OPENCV_INSTALL_PATH%/x64/mingw/lib

インストールが完了したら、試しにrequireしてみます。

D:\>irb
irb(main):001:0> require 'opencv'
=> true
irb(main):002:0> OpenCV::CV_VERSION
=> "2.4.13"

うまくいったようです。

注意点として、 %OPENCV_INSTALL_PATH%\x64\mingw\bin%DEVKIT_PATH%\mingw\binruby-opencvを使うときには必ずパスに追加する必要があります。 でないと、以下のエラーが発生します。

D:\>irb
irb(main):001:0> require 'opencv'
LoadError: 126: 指定されたモジュールが見つかりません。   - D:/local/ruby/lib/ruby/gems/2.3.0/gems/ruby-opencv-0.0.17/lib/opencv.so
        from D:/local/ruby/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:133:in `require'
        from D:/local/ruby/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:133:in `rescue in require'
        from D:/local/ruby/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:40:in `require'
        from D:/local/ruby/lib/ruby/gems/2.3.0/gems/ruby-opencv-0.0.17/lib/opencv.rb:8:in `rescue in <top (required)>'
        from D:/local/ruby/lib/ruby/gems/2.3.0/gems/ruby-opencv-0.0.17/lib/opencv.rb:5:in `<top (required)>'
        from D:/local/ruby/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:133:in `require'
        from D:/local/ruby/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:133:in `rescue in require'
        from D:/local/ruby/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:40:in `require'
        from (irb):1
        from D:/local/ruby/bin/irb.cmd:19:in `<main>'

%OPENCV_INSTALL_PATH%\x64\mingw\bin のほうはOpenCVのDLLのフォルダなので当然必要なのですが、今回の手順でビルドした場合はMinGWlibgcc_s_sjlj-1.dlllibstdc++-6.dll もリンクされるので、これらが格納されている %DEVKIT_PATH%\mingw\bin もパスに追加する必要があるのでした*1

そんなわけで

どうにかWindowsruby-opencvが使えるようになりました。

*1:静的リンクしてしまえばよいのだろうけど、extconf.rb経由でうまくgccにオプションが渡せなかったので、とりあえずそのままに。

ruby-opencvの進捗の話(2014年2月版)

はじめに

なんか気がついたら2014年も1ヶ月が過ぎてますが、ruby-opencvのお話です。 前回からバージョンもだいぶ上がり、機能も地味にいろいろ追加されてるので、ちょっとだけ紹介します。

APIリファレンス的なものを(ようやく)用意しました

前からちょっとずつYARDで書いてたアレをようやくマージしました。 rubydoc.infoで見れるのでどうぞ。

Documentation for ruby-opencv

微妙に網羅できてないのもありますが、よく使うやつはだいたい書いてあります。

FaceRecognizerを追加しました

FaceRecognizer #17 でご要望を頂いておきながらずーっと放っておいたFaceRecognizerが(v0.0.11から)使えるようになりました。 公式のチュートリアル Face Recognition with OpenCV に相当するサンプルも用意してあるので、興味のある方はぜひどうぞ。

https://github.com/ruby-opencv/ruby-opencv/tree/master/examples/facerec

FaceRecognizer(EigenFaces)のサンプルコード

せっかくなので、FaceRecognizerのEigenFacesを使って顔認識してみましょう。 Ubuntu 13.10 + Ruby 2.1.0-p0(x86_64-linux) + ruby-opencv 0.0.12 で動作確認していますが、だいたいどの環境でも同じように動くはずです。

1. 認識用の顔画像を AT&T Facedatabase から取ってくる

http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html から認識用の顔画像を取ってきて展開します。

$ wget http://www.cl.cam.ac.uk/Research/DTG/attarchive/pub/data/att_faces.zip
$ unzip att_faces.zip

2. テストデータを用意する

学習用に顔画像をラベルと対応付けたファイルを作成します。 OpenCV公式チュートリアルこれを使ってもいいですが、 Ruby版のcreate_csv.rbも作ったので今回はこっちを使いましょう。

# create_csv.rb
if ARGV.size != 1
  puts "usage: ruby #{__FILE__} <base_path>"
  exit
end

BASE_PATH = ARGV[0]
SEPARATOR = ';'

label = 0
Dir.glob("#{BASE_PATH}/*").each { |dir|
  if FileTest::directory? dir
    Dir.glob("#{dir}/*") { |filename|
      puts "#{filename}#{SEPARATOR}#{label}"
    }
    label += 1
  end
}

画像ファイルのフォルダを引数で指定して実行します。 結果は標準出力に出るので、適当にリダイレクトしてください。

$ ruby create_csv.rb att_faces > at.txt

実行すると、下記のように 画像ファイル名;ラベル というフォーマットで対応付けのファイルが作成されます。

$ cat at.txt
att_faces/s34/2.pgm;0
att_faces/s34/3.pgm;0
att_faces/s34/8.pgm;0
att_faces/s34/4.pgm;0
att_faces/s34/5.pgm;0
att_faces/s34/10.pgm;0
att_faces/s34/9.pgm;0
att_faces/s34/7.pgm;0
att_faces/s34/6.pgm;0
att_faces/s34/1.pgm;0
...

3. 顔認識してみる

こんな感じのプログラム(eigenfaces.rb)を作ります。

# eigenfaces.rb
require 'opencv'
include OpenCV

def read_csv(filename, sepalator = ';')
  images = []
  labels = []
  open(filename, 'r') { |f|
    f.each { |line|
      path, label = line.chomp.split(sepalator)
      images << CvMat.load(path, CV_LOAD_IMAGE_GRAYSCALE)
      labels << label.to_i
    }
  }
  [images, labels]
end

if ARGV.size < 1
  puts "usage: ruby #{__FILE__} <csv.ext>"
  exit 1
end

fn_csv = ARGV.shift
output_folder = ARGV.shift

# 顔画像を読み込む
images, labels = read_csv(fn_csv);

height = images[0].rows;

# 識別対象の顔画像は学習対象とは別にしておく
test_sample = images.pop
test_label = labels.pop

# Eigenfacesのモデルを作成して学習
model = EigenFaces.new
model.train(images, labels)

# 識別処理
# 識別結果のラベルと一致度が返ってくる
predicted_label, predicted_confidence = model.predict(test_sample)

# 結果を表示
puts "Predicted class: #{predicted_label} / Actual class: #{test_label}"
puts "Confidence: #{predicted_confidence}"

w1 = GUI::Window.new('Predicted')
w2 = GUI::Window.new('Actual')

w1.show images[predicted_label]
w2.show images[test_label]

GUI::wait_key

で、実行します。引数は2で作ったファイルのファイル名です。

$ ruby eigenfaces.rb at.txt

実行結果はこんな感じ(左が識別結果で右が実際の顔)。どうやらそれっぽく動いているようです。

f:id:ser1zw:20140211002306p:plain

そんなわけで

ruby-opencvの進捗状況でした。

ruby-opencvがRuby 2.0で使えるようになりました

というわけで

気がついたらだいぶ時間が開いてしまいましたが、ようやくRuby 2.0に対応しました。

ruby-opencv | RubyGems.org | your community gem host

動作環境は

  • Ruby 1.9.3, 2.0.0
  • OpenCV 2.4.5

となっております。 例によってWindows用にはmingw32,mswin32用のコンパイル済みパッケージも用意してあります。

Ruby 2.0対応以外の変更点は、バグ修正やFat gem作成機能追加ぐらいなので、そろそろ新しい機能も入れたいところですね。 中途半端に手を付けたFaceRecognizerを次回ぐらいで入れたいなー、 などと考えております。あとはリファレンスも進めなければ…。

開発は以下のリポジトリでやっていますので、お気づきの点やご要望、イケてるPull Requestなど、お待ちしております。

ruby-opencv/ruby-opencv - GitHub

ruby-opencvをようやくRubyGems.orgに登録しました

というわけで

ようやく $ gem install ruby-opencv するだけでruby-opencvがインストールできるようになりました!

ruby-opencv | RubyGems.org | your community gem host

インストールするには?

必要なもの

  • Ruby 1.8.7 または 1.9.3
  • OpenCV 2.4.3

Linux/Macの場合

  1. OpenCVをインストール
  2. 以下のコマンドでruby-opencvをインストール
$ gem install ruby-opencv -- --with-opencv-dir=/path/to/opencvdir

/path/to/opencvdirには、OpenCVがインストールされているディレクトリを指定してください(指定しない場合は /usr/local を見に行きます)。

Windowsの場合

Windows版はmingw32とmswin32用のコンパイル済みパッケージが用意されています。

  1. OpenCVをインストール
  2. OpenCVのdllが格納されたフォルダにパスを通す(例えばOpenCVをC:\opencvにインストールした場合、mswin32ならC:\opencv\build\x86\vc10\bin, mingw32ならC:\opencv\build\x86\mingw\binにパスを通してください)
  3. 以下のコマンドでruby-opencvをインストール
$ gem install ruby-opencv

今後の展開とか

とりあえず

  • Ruby 2.0だと動かないっぽいので直す(ruby-opencv v0.0.8時点)
  • さっさとリファレンスを作る(一応、documentationブランチで作業中)
  • OpenCV 2.xの機能に対応させる

あたりを中心に進めたいと思っています。

動かない!とかこんな機能が欲しい!とかコードがイケてない!など、お気づきの点がございましたら、 ぜひともGitHubのIssuesページよりお知らせください。Pull Requestも大歓迎ですよー。

ruby-opencv/ruby-opencv - GitHub

第5回 Ruby/OpenCV進捗報告

はじめに

気がついたら2012年になってましたが、Ruby/OpenCVもじわじわと進化を続けております。

進捗

開発リポジトリが移動しました!

GitHubでOrganizationアカウントを作って、メインのリポジトリをそっちに移してみました。
そんなわけで、今後のメインリポジトリ

ruby-opencv/ruby-opencv - GitHub

になります。

ser1zw/ruby-opencv - GitHub のほうは機能追加とかするときの作業用に使う予定です。

Windows(mingw32, mswin32)に対応しました!

ようやくWindowsでも動くようになりました。
と言ってもまだバイナリ配布はしてないので、自前でのビルドが必要です。


前提条件
OpenCVのインストールが必要です。
OpenCV2.3.1の入手、ダウンロード、インストール、環境設定 | イメージングソリューションなどを参考にインストールしてください。dllのパスの設定も忘れずに!
なお、以降の説明では、OpenCVが C:\path\to\opencvdir にインストールされているものとします。


mswin32の場合
mswin32の場合はVisual C++ (Express EditionでOK)を入れて、Visual Studioコマンドプロンプトから下記のコマンドを実行します。

$ git clone git://github.com/ruby-opencv/ruby-opencv.git  # またはGitHubからzipファイルをダウンロードして展開
$ cd ruby-opencv
$ ruby extconf.rb --with-opencv-dir=C:\path\to\opencvdir\bin\install  # 自分でビルドしたOpenCVを使う場合(バイナリ版を使う場合は下記参照)
$ nmake
$ nmake install

バイナリ配布されているOpenCVをそのまま使う場合は、includeフォルダが C:\path\to\opencvdir\build\include 、libフォルダが C:\path\to\opencvdir\build\x86\vc10\lib となるので、extconf.rb のオプションを

$ ruby extconf.rb --with-opencv-include=C:\path\to\opencvdir\build\include --with-opencv-lib=C:\path\to\opencvdir\build\x86\vc10\lib

みたいな感じにしてください。


mingw32の場合
mingw32の場合はMinGWのgcc, g++, MSYSを入れて*1、MSYSのコンソールから下記のコマンドを実行します。

$ git clone git://github.com/ruby-opencv/ruby-opencv.git  # またはGitHubからzipファイルをダウンロードして展開
$ cd ruby-opencv
$ ruby extconf.rb --with-opencv-dir=/C/path/to/opencvdir/install  # 自分でビルドしたOpenCVを使う場合
$ make
$ make install

mswin32と同様、バイナリ配布されているOpenCVを使う場合は、

$ ruby extconf.rb --with-opencv-include=/C/path/to/opencvdir/build/include --with-opencv-lib=/C/path/to/opencvdir/build/x86/mingw/lib

みたいな感じで指定してください。

ffcallが不要になりました!

これで余計な依存ライブラリがなくなり、インストールがちょっとだけ楽になりました。やったね!

今後の展開

とりあえず

  • gem install hogehoge でインストールできるようにしたい
    • rubygems.orgで公開?
    • Windows用はバイナリも配布したい
  • 全文検索機能付きのリファレンスを作りたい
    • るりまサーチ的なやつ
  • C++版の機能を追加したい
    • DescriptorMatcherとか

みたいなことを考えてます。他にもこんな機能ほしい!とかありましたらお知らせください。

デモ

cvAdaptiveThresholdのラッパーを追加したので、そのサンプルコード的なやつを書いてみます。
環境は

です。

# -*- encoding: utf-8 -*-
require 'opencv'
include OpenCV

img = IplImage.load('Lenna.jpg', CV_LOAD_IMAGE_GRAYSCALE)

# CvMat#adaptive_threshold(max_value, options = nil)
#   max_value (Integer) - 最大値
#   options (Hash) - オプションパラメータ
#     :adaptive_method - 使用するアルゴリズム (:mean_c または :gaussian_c)
#     :threshold_type - しきい値処理の種類 (:binary または :binary_inv)
#     :block_size - しきい値を計算するときのブロックサイズ
#     :param1 - 各手法で使うパラメータ
result1 = img.adaptive_threshold(255, :block_size => 25)
result2 = img.adaptive_threshold(128, :adaptive_method => :gaussian_c, :threshold_type => :binary_inv, :block_size => 5, :param1 => 10)

GUI::Window.new('original').show img
GUI::Window.new('mean_c').show result1
GUI::Window.new('gaussian_c').show result2
GUI::wait_key
GUI::Window.destroy_all

結果はこんな感じ。いい感じにしきい値処理がされています。

f:id:ser1zw:20120216003049p:image

まとめ

そんなわけで、第5回Ruby/OpenCV進捗報告でした。

リポジトリはこちら

ruby-opencv/ruby-opencv - GitHub

人柱、Pull Request、ご要望、バグ報告等は大歓迎です!

*1:インストーラからC Compiler, C++ Compiler, MSYS Basic System, MinGW Developer Toolkitあたりを入れておけば大丈夫なはず http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/

第4回 Ruby/OpenCV進捗報告

はじめに

RubyKaigiは終わっちゃいましたが、Ruby/OpenCVの開発はまだまだ終わりませんよー。

進捗

SURFが使えるようになりました!

みんなの大好きなcvExtractSURFが、ついにRuby/OpenCVでも使えるようになりました。
これで好きなだけ局所特徴量取りまくればいいんじゃないかと思います。

CvMat#find_contoursのナイスなサンプルが追加されました!(thenosemanさんのおかげ)

thenosemanさんがCvMat#find_contoursについて、詳しい解説付きのサンプルコードを書いてくれました。example/contours/*.rbに入っています。ドキュメントが壊滅的なRuby/OpenCVですが、これを機に少しずつドキュメントを増やしていきたいところです。

OpenCV 2.3.0に対応しました!

油断してたらOpenCV 2.3.0がリリースされてしまいましたが、幸い大幅に変更することなく、対応することができました。
現在のmasterブランチはOpenCV 2.3.0に対応したバージョンになっています。

エラーハンドリングの処理を(だいたい)追加しました

これまではOpenCV側で例外が発生した場合にRuby側へ例外が通知されず、問答無用でプログラムが終了してしまいました。そこで、OpenCV側での例外が発生した場合、それをキャッチしてRubyの例外として投げ直すことで、Ruby側で例外処理を行えるように修正しました。
主要な機能についてはほぼ完了しているため、普通に使う分にはあまり困らないかと思います。

テスト

だいたい全体の80〜90%ぐらいは完了した感じです。


ユニットテストとエラーハンドリング処理の追加の進捗は下記の通りです。CvContourTreeとか地味にめんどくさそうなのが残ってますが、さっさと終わらせてしまいたいところです。

クラス/モジュール テストの進捗 例外処理の進捗
CvMat だいたい完了 だいたい完了
OpenCV cvCvtColor系の機能が(ry だいたい完了
CvSeq だいたい完了 だいたい完了
CvRect だいたい完了 だいたい完了
CvContour だいたい完了 だいたい完了
CvMoments だいたい完了 だいたい完了
CvPoint3d32f だいたい完了 だいたい完了
CvScalar だいたい完了 だいたい完了
CvPoint だいたい完了 だいたい完了
CvSize2d32f だいたい完了 だいたい完了
CvPoint2d32f だいたい完了 だいたい完了
CvSize だいたい完了 だいたい完了
CvChain だいたい完了 だいたい完了
CvCircle32f だいたい完了 だいたい完了
CvBox2d だいたい完了 だいたい完了
CvConnectedComp だいたい完了 だいたい完了
CvLine だいたい完了 だいたい完了
CvTwoPoints だいたい完了 だいたい完了
CvTermCriteria だいたい完了 だいたい完了
IplImage だいたい完了 だいたい完了
CvHumoments だいたい完了 だいたい完了
CvFont だいたい完了 だいたい完了
IplConvKernel だいたい完了 だいたい完了
GUI だいたい完了 だいたい完了
MouseEvent だいたい完了 だいたい完了
TrackBar だいたい完了 だいたい完了
Window だいたい完了 だいたい完了
Curve だいたい完了 だいたい完了
CvAvgComp だいたい完了 だいたい完了
CvCapture だいたい完了 だいたい完了
CvError だいたい完了 だいたい完了
CvChainCode だいたい完了 だいたい完了
CvSet だいたい完了 だいたい完了
CvSlice だいたい完了 だいたい完了
CvVideoWriter だいたい完了 だいたい完了
CvHaarClassifierCascade だいたい完了 だいたい完了
CvCondensation まだやってない まだやってない
CvContourTree まだやってない まだやってない
CvConvexityDefect まだやってない まだやってない
CvHistogram まだやってない まだやってない
CvMatND まだやってない まだやってない
CvMemStorage まだやってない まだやってない
CvSparseMat まだやってない まだやってない
Point3dSet まだやってない まだやってない
PointSet まだやってない まだやってない

デモ

CvMat#extract_surfを使ってSURFのキーポイントを取得します。OpenCV.jpの「SURFによる特徴点抽出」Ruby/OpenCV版です。
環境はRuby 1.9.2+OpenCV 2.3.0+Ubuntu 11.04です。

require 'opencv'
include OpenCV

# 画像をロード
filename = ARGV.size > 0 ? ARGV[0] : 'Lenna.png'
mat = CvMat.load(filename, CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH)

# CvMat#extract_surfを使用するためにグレースケール画像に変換
gray = mat.BGR2GRAY

# 画像からSURFのキーポイントとディスクリプタを抽出
keypoints, descriptors = gray.extract_surf(CvSURFParams.new(500, true, 2, 3))

# キーポイントを描画
keypoints.each { |kpt|
  mat.circle!(kpt.pt, (kpt.size * 0.25), :color => CvColor::Blue, :thickness => 1, :line_type => :aa)
}

# 結果を表示
GUI::Window.new('SURF').show mat
GUI::wait_key


結果はこんな感じ。( ゚∀゚)o彡゜SURF!SURF!!
f:id:ser1zw:20110725210908p:image

まとめ

以上、第4回Ruby/OpenCV進捗報告でした。

リポジトリはこちら

ser1zw/ruby-opencv - GitHub
https://github.com/ser1zw/ruby-opencv

第3回 Ruby/OpenCV進捗報告

はじめに

連休もそろそろ終わりですが、皆様いかがお過ごしでしょうか?
Ruby/OpenCVの開発はゆるゆる進んでおります。

進捗

gemが作れるようになりました!(主にpctingさんのおかげ)

pctingさんがナイスな修正をしてくれたおかげで、Ruby/OpenCVのgemがRakeで簡単に作れるようになりました。

gemを作ってインストールするには、

$ git clone git://github.com/ser1zw/ruby-opencv.git
$ cd ruby-opencv
$ bundle install
$ rake gem
$ gem install pkg/opencv-*.gem

という感じでOKです*1

$ rake install_gem

とやっても大丈夫なはずなのですが、RVMを使っているとうまくいかないことがある(パスの問題かも)ので、要調査…。

ffcall無しでもGUIが使えるようになりました!(ただしTrackbar以外)

これまではffcallがインストールされていない場合、WindowなどGUIに関する機能が使えませんでした。しかし、実際にffcallに依存しているのはWindow#set_trackbarのみ*2ですので、その他の機能についてはffcall無しでも使用できるように変更しています。

現状ではffcallまわりがちょっと不安定な上、他のプラットフォームで動かすときに困りそうなので、できれば使わないようにしたいと思っています。要はクロージャっぽいものが使えればいいので、Boost使ってなんとかならないかなーとか、でもこれだけのためにBoost持ち出すのもなーとか、そもそもC++書けないしなーとか考えつつ、代替案を検討中です。

テスト

ユニットテストの進捗は以下の通りです。GUIまわりの修正とテストがだいたい完了しており、CvMatも地味に進んでいます。
まだ手をつけてないものも結構あるのですが、さっさと終わらせて新機能の追加に移りたいところです。

クラス/モジュール 進捗
CvMat 90%完了
OpenCV cvCvtColor系の機能がけっこう残ってる
CvSeq だいたい完了
CvRect だいたい完了
CvContour だいたい完了
CvMoments だいたい完了
CvPoint3d32f だいたい完了
CvScalar だいたい完了
CvPoint だいたい完了
CvSize2d32f だいたい完了
CvPoint2d32f だいたい完了
CvSize だいたい完了
CvChain だいたい完了
CvCircle32f だいたい完了
CvBox2d だいたい完了
CvConnectedComp だいたい完了
CvLine だいたい完了
CvTwoPoints だいたい完了
CvTermCriteria だいたい完了
IplImage だいたい完了
CvHumoments だいたい完了
CvFont だいたい完了
IplConvKernel だいたい完了
GUI だいたい完了
MouseEvent だいたい完了
TrackBar だいたい完了
Window だいたい完了
Curve まだやってない
CvAvgComp まだやってない
CvCapture まだやってない
CvChainCode まだやってない
CvCondensation まだやってない
CvContourTree まだやってない
CvConvexityDefect まだやってない
CvError まだやってない
CvHaarClassifierCascade まだやってない
CvHistogram まだやってない
CvMatND まだやってない
CvMemStorage まだやってない
CvSet まだやってない
CvSlice まだやってない
CvSparseMat まだやってない
CvVideoWriter まだやってない
Point3dSet まだやってない
PointSet まだやってない

デモ

前回までとはちょっと趣向を変えて、OpenCVのGUIを使ったペイントのデモです*3
マウスのドラッグで線の描画、右クリックで塗りつぶし、ESCキーで終了です。また、キーを入力して線の太さの変更、色名を入力して線の色の変更ができます。
環境はRuby 1.9.2+OpenCV 2.2+Ubuntu 11.04です。

require 'opencv'
include OpenCV

# Windowに描画領域を作成
window = GUI::Window.new('free canvas')
canvas = CvMat.new(500, 500, CV_8U, 3).fill!(CvColor::White)
window.show canvas

colors = CvColor::constants.collect{ |i| i.to_s }

usage =<<USAGE
[mouse]
drag            - draw
right button    - fill by color
[keyborad]
1 to 9          - change thickness of line
type color name - change color
esc             - exit
USAGE
puts usage

# 線の色と太さ
opt = {
  :color => CvColor::Black,
  :tickness => 1
}

# マウスイベントの処理
point = nil
window.on_mouse{ |m|
  case m.event
  when :left_button_down # マウスドラッグで線の描画
    canvas.line!(m, m, opt)
    point = m
  when :move
    if m.left_button?
      canvas.line!(point, m, opt) if point
      point = m
    end
  when :left_button_up
    point = nil
  when :right_button_down # マウスの右ボタンで塗りつぶし
    canvas.flood_fill!(m, opt[:color])
  end
  window.show canvas
}

# キー入力の処理
color_name = ''
while key = GUI.wait_key
  next if key < 0 or key > 255
  case key.chr
  when "\e" # ESCキーで終了
    exit
  when '1'..'9' # 線の太さを変更
    puts "change thickness to #{key.chr.to_i}."
    opt[:thickness] = key.chr.to_i
  when /[A-Za-z]/ # 線の色を変更
    color_name << key.chr
    choice = colors.find_all{ |i| i =~ /\A#{color_name}/i }
    if choice.size == 1
      color = choice[0]
      puts "change color to #{color}."
      opt[:color] = CvColor::const_get(color)
    end
    color_name = '' if choice.size < 2
  end
end


こんな感じでペイントっぽいことができます。
f:id:ser1zw:20110507081608p:image

まとめ

そんなわけで、第3回Ruby/OpenCV進捗報告でした。

リポジトリはこちら

人柱はいつでも大歓迎ですよー。
ser1zw/ruby-opencv - GitHub
https://github.com/ser1zw/ruby-opencv

*1:bundlerが入っていない人は、事前に gem install -r bundler してください

*2:もともとはWindow#set_mouseeventでもffcallの機能を使用していたのですが、使わないように修正しました

*3:もともとサンプルとして添付していたのですが、今までまともに動かなかったという…