はじめに
連休もそろそろ終わりですが、皆様いかがお過ごしでしょうか?
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
