# https://github.com/ruby-opencv/ruby-opencv require 'opencv' include OpenCV require 'rubygems' require "win32/screenshot" bitmap = Win32::Screenshot::Take.of(:desktop) byte = bitmap.bitmap array = byte.unpack("x54C*") data = Array.new p = 0 bitmap.height.times{ bitmap.width.times{ a = Array.new a << array[p];p+=1; a << array[p];p+=1; a << array[p];p+=1; data << a } # 4で割れないとき amari = bitmap.height%4 p += 4 - amari unless amari == 0 } i = CvMat.new(bitmap.height, bitmap.width, :cv8u, 3) i.set_data(data) i.flip!(:y) # (4) 結果を表示 GUI::Window.new('screenshot').show i GUI::wait_key
bitmapファイルの構造はこちらから
http://www.kk.iij4u.or.jp/~kondo/bmp/
http://www.ruche-home.net/program/bmp/struct
cvMatの構造はこちらから
http://opencv.jp/cookbook/opencv_mat.html
Ruby cvMatの参考ソース
https://github.com/ruby-opencv/ruby-opencv/blob/master/test/test_cvmat.rb
Win32/Screenshotの紹介
http://rubydoc.info/gems/win32screenshot/1.0.7/Win32/Screenshot/Image
–>>>>
結局、スピードの観点からc++のDLL内部で処理させることに・・・。残念無念。
コメント
処理速度の件(http://ow.ly/axhhk)、もう既に解決されているかもしれませんが、せっかくなので。
手っ取り早くやるなら、一旦一時ファイルに書きこんでからCvMat.loadで読み直すのが簡単かと思います。
こんな感じで。
https://gist.github.com/2500375
手元の環境では、100倍ぐらい速くなっているようです。
https://gist.github.com/2500365
※fxkireekさんのコードを一部コメントアウトしていますが、結果には影響しないはずです
OpenCVのcv::imdecode()を使用すれば、Bitmapデータを直接メモリ上で処理できるため、さらなる高速化が期待できます。
しかしまだruby-opencvには実装されていないので…今後追加します。