2010年10月7日木曜日

ffi-opencv を作って遊んでみた。


このエントリーをはてなブックマークに追加

opencv を使わないといけない事象がでてきたのでいじり始めた。

ruby/OpenCV を使おうとしたら、どうやら放置プレイぽいしmatz ruby-1.8.x でしか動かないぽい。

とりあえず ruby/dl でちこちこ書いてたらなんかdouble がちゃんと扱えない風。どうやら設計的な問題らしい。

ffiを使うといんじゃね? と ay先生 に言われてちょっと調べてみると ruby-ffi なるものがあるようだ。

dl とちょっと違うのでとまどいつつ使ってみると。なかなかいい。

require "ffi"

module OpenCV

  module Highgui

      extend FFI::Library

      ffi_lib "/opt/local/lib/libhighgui.dylib"

      attach_function :cvNamedWindow,[:string, :int], :int

      attach_function :cvShowImage, [:string,:pointer], :void

      attach_function :cvQueryFrame, [:pointer],:pointer

      attach_function :cvCreateCameraCapture,[:int],:pointer

      attach_function :cvReleaseCapture,  [:pointer], :void

end

こんな感じ ffi_lib でshared object 指定して, attach_function , 関数, [引数],返り値

とかすればいい。

include OpenCV

include OpenCV::Highgui

window = cvNamedWindow("hoge")

cap = cvCareteCameraCapture(0)

frame = cvQueryFrame(cap)

cvShowImage("hoge",frame)

key = cvWaitKey(0)

でcap を最後に開放しないといかんのだけど

CVAPI(void) cvReleaseCapture( CvCapture** capture );

ううむポインタのポインタってどうすんの?dl だと .ref で終わりだがないんだなぁとおもったら

cap_p = FFI::MemoryPointer.new :pointer

cap_p.put_pointer(0,cap)

cvReleaseCapture(cap_p)

とかするといいらしい。

関数の引数が構造体だったりするときは

    class CvSize < FFI::Struct

      layout :width, :int,

             :height, :int

    end

   attach_function :cvCreateImage, [CvSize.by_value,:int,:int],:pointer
CvSize.by_value なのはそのままだとポインタ渡しだから明示しないといけない。なんかドキュメントにぜんぜん書いてなくてだいぶなやんだ> by_value
手で色々追加したあとに
ffi-swig-generator なるものを発見 swig のinterface ファイルを書いておくと ruby-ffi なscript を生成してくれるらしい...先に気がつけ...
そしてmacruby では attach_function しかsupport していないし
macports のopencv は複数のstream を別々のwindow で表示させようとすると同じものが映るとかいうバグ(head だと治ってた)..
ううむ。
とりあえず ffi-opencv は http://github.com/kazu/ffi-opencv においておきました。ちょびっとしか関数ないけど..

0 件のコメント:

コメントを投稿

zenback