RubyでとったスクリーンショットをcvMat型に変換

スポンサーリンク
# 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内部で処理させることに・・・。残念無念。

コメント

  1. ser1zw より:

    処理速度の件(http://ow.ly/axhhk)、もう既に解決されているかもしれませんが、せっかくなので。
    手っ取り早くやるなら、一旦一時ファイルに書きこんでからCvMat.loadで読み直すのが簡単かと思います。
    こんな感じで。
    https://gist.github.com/2500375

    手元の環境では、100倍ぐらい速くなっているようです。
    https://gist.github.com/2500365
    ※fxkireekさんのコードを一部コメントアウトしていますが、結果には影響しないはずです

    OpenCVのcv::imdecode()を使用すれば、Bitmapデータを直接メモリ上で処理できるため、さらなる高速化が期待できます。
    しかしまだruby-opencvには実装されていないので…今後追加します。

タイトルとURLをコピーしました