phonondrive

2007.02.22

+ Ruby :: Ruby 拡張ライブラリに手を入れようとして手を挟まれる。

OpenCV だと webcam から得られるデータが IplImage 形式で、より汎用性のある DIB 形式に変換しないことには Ruby/SDL や Camellia で遊ぶこともままなりません。どうやら IplImage 構造体の imageData メンバに生データが入ってる (hawaii.aist-nara.ac.jp) っぽいのですが、Ruby から取り出す術がわかりません。「直接取り出すことは出来ない」 で FA なのかな・・・。

しょうがないので、Ruby/OpenCV のソースに手を入れて、ライブラリが IplImage 以外のデータ形式を返せないものかと試行錯誤してみました。素直に IplImage.imageData を返してみたり、バッファに memcpy でまるっと読み込んで返してみたり、Camellia のソースを見て CamImage.get_pixels をまねしてみたり、果ては CamImage オブジェクトを作って返してみたりと、いろいろやってみたのですが、無常にも Ruby は segmentation fault で落ちるばかりです。

んで、今日は諦めて google 相手に愚痴ってたら、衝撃の事実が! 戻り値は VALUE 型でなければならない (jcom.home.ne.jp)。ああ、痛すぎる。

VALUE 型の関数は return で rb_dbl2big とか rb_float_new とかおまじないしてて、これはきっと特別なケースなんだろうと思ってたんだけど、むしろそっちが本流なのね。

Ruby 拡張ライブラリの作成方法の習得を完全にスキップしてた。まぁ今日のところは、なんやかんやソースに手を入れても、なんとかコンパイルできることがわかっただけでも良しとしよう。

+ Ruby :: SDL :: Ruby/OpenCV/SDL で webcam からの絵が出たー

髪の毛が乾くまでの間ちょっくらコードでもいじってみようかと、先ほどの失敗を踏まえつつちょこと修正してみたら、サックリ絵が出たー。

Ruby/OpenCV/SDL

なんか絵が逆さまだったり、途切れてたり、色が変だったり、10 回に 1 度くらいしかスクリプトが走らなかったりしますが、『あ・・・アハ・・・読める、読めるぞぉ。』 てなわけで、SDL 上に webcam からの絵が読めました。

webcam からの画像を取得 (grab and retrieve) する OpenCV::CvCapture.query をちょろっと改造しました。

(cvcapture.cpp)

VALUE
rb_query_cam(VALUE self)
{
   IplImage *frame = cvQueryFrame(CVCAPTURE(self));
   return rb_str_new2((char *)frame->imageData);
}

Ruby スクリプト

(camtest.rb)

require 'sdl'
require "opencv"
include OpenCV

SDL.init( SDL::INIT_VIDEO )
screen = SDL::setVideoMode(640,480,16,SDL::SWSURFACE)
SDL::WM::setCaption('SDL_app','camtest.rb icon')

capture = CvCapture.open(-1)

image = SDL::Surface.new_from(capture.query_cam, 320, 240, 24, 320*3, 0xff0000, 0x00ff00, 0x0000ff, 0)
image.setColorKey( SDL::SRCCOLORKEY ,1)
image = image.displayFormat

SDL.blitSurface(image, 0, 0, 240, 180, screen, 0, 0)

色が変なのは (R|G|B)mask の指定が BGR になってたからです。RGB で ok。他は・・・色深度とかデータ長とか整合性をとってないせいかも。あとはメモリリークしてる? いや、query に入れたのがまずかったのかな。

キャプチャ絵を DIB で取得するんじゃなくて、ひとまず IplImage で持ってきたのを IplImage.to_dbi みたいに使えた方が便利だな。OpenCV の画像認識も併用出来るしね。

まぁ細かいところはあとで詰めていくとして、とりあえず絵が出た。大変よろこばしい。

お名前:
空欄:
コメント:

最新 | TOP に戻る

· affiliates
Ads by Google AdSense Associated with Amazon.co.jp Powered by Amagle AltADs Affiliated by VALUE DOMAIN
· hosting servers
XREA ismusic networks

Subscribe with livedoor Reader



FRUITS CLiPPER, capsule SSugarless GiRL, capsule THE IDOLM@STER MASTER ARTIST 07 三浦あずさ NEXUS-2060, capsule