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 だと治ってた)..
ううむ。