読者です 読者をやめる 読者になる 読者になる

第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