ruby-opencvをWindows(RubyInstaller)で使う
ruby-opencvは一応Windowsもサポートしているわけですが、いつからかOpenCVがMinGW版のバイナリを配布しなくなってしまったため、RubyInstallerを使っている場合は自前でOpenCVをビルドしなければならない状態になっていました。 GitHubでもissueがいくつか挙がってたのをずーっと放置していたのですが、さすがに放置し過ぎな気がしてきたので、取り急ぎインストール用のドキュメントを作成しました。
大雑把に言うと、ポイントは以下の2点です。
- DevKitのビルドツール(mingw-32-make、gcc、g++)を使ってOpenCVをビルドする
- ruby-opencvをインストールしたり使ったりするときに、OpenCVのDLLのフォルダに加えてMinGWのDLLのフォルダをパスに追加する
想定環境 & 用意するもの
- Windows 10 64bit
- RubyInstaller版 Ruby 2.3.0p0 x64-mingw32
- DevKit (DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe)
- OpenCV 2.4.13
- CMake 3.6.0 x64
- ruby-opencv 0.0.17
ちなみに、OpenCV 3系だとDevKitに含まれるgccとかg++が古すぎてビルドできません。DevKitアップデートされないかな…。
インストール方法
OpenCVを取ってくる
まずはOpenCVを https://sourceforge.net/projects/opencvlibrary/ あたりから取ってきて、適当なフォルダに展開します。
CMakeでOpenCVのMakefileを作成する
コマンドプロンプト(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
に、OpenCVが D:/work/opencv-2.4.13
にインストールされていて(ソースコードは D:/work/opencv-2.4.13/sources
)、出力先フォルダが D:/opencv-2.4.13
になるという前提です。もし別のフォルダを指定する場合は、 DEVKIT_PATH
、 SOURCE_PATH
、 OPENCV_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\bin
はruby-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のフォルダなので当然必要なのですが、今回の手順でビルドした場合はMinGWのlibgcc_s_sjlj-1.dll
と libstdc++-6.dll
もリンクされるので、これらが格納されている %DEVKIT_PATH%\mingw\bin
もパスに追加する必要があるのでした*1。
そんなわけで
ruby-opencvの進捗の話(2014年2月版)
はじめに
なんか気がついたら2014年も1ヶ月が過ぎてますが、ruby-opencvのお話です。 前回からバージョンもだいぶ上がり、機能も地味にいろいろ追加されてるので、ちょっとだけ紹介します。
APIリファレンス的なものを(ようやく)用意しました
前からちょっとずつYARDで書いてたアレをようやくマージしました。 rubydoc.infoで見れるのでどうぞ。
微妙に網羅できてないのもありますが、よく使うやつはだいたい書いてあります。
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
実行結果はこんな感じ(左が識別結果で右が実際の顔)。どうやらそれっぽく動いているようです。
そんなわけで
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をようやく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の場合
$ gem install ruby-opencv -- --with-opencv-dir=/path/to/opencvdir
/path/to/opencvdirには、OpenCVがインストールされているディレクトリを指定してください(指定しない場合は /usr/local を見に行きます)。
Windowsの場合
Windows版はmingw32とmswin32用のコンパイル済みパッケージが用意されています。
- OpenCVをインストール
- OpenCVのdllが格納されたフォルダにパスを通す(例えばOpenCVをC:\opencvにインストールした場合、mswin32ならC:\opencv\build\x86\vc10\bin, mingw32ならC:\opencv\build\x86\mingw\binにパスを通してください)
- 以下のコマンドでruby-opencvをインストール
$ gem install ruby-opencv
今後の展開とか
とりあえず
- Ruby 2.0だと動かないっぽいので直す(ruby-opencv v0.0.8時点)
- さっさとリファレンスを作る(一応、documentationブランチで作業中)
- OpenCV 2.xの機能に対応させる
あたりを中心に進めたいと思っています。
動かない!とかこんな機能が欲しい!とかコードがイケてない!など、お気づきの点がございましたら、 ぜひともGitHubのIssuesページよりお知らせください。Pull Requestも大歓迎ですよー。
第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
結果はこんな感じ。いい感じにしきい値処理がされています。
まとめ
そんなわけで、第5回Ruby/OpenCV進捗報告でした。
第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
まとめ
以上、第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
まとめ
そんなわけで、第3回Ruby/OpenCV進捗報告でした。
リポジトリはこちら
人柱はいつでも大歓迎ですよー。
ser1zw/ruby-opencv - GitHub
https://github.com/ser1zw/ruby-opencv