rubyでwebcamera


Debianのhornetseye
webカメラの画像をrubyから扱う必要があり、どのようにすれば良いかを調べていたら、hornetseyeというものを使うと比較的簡単にできそうなので、やってみた。スズメバチの目か。まず、webカメラを扱うためのhornetseye-v4l2と、画面に表示するためのhornetseye-xorgをインストールする。

sudo aptitude install ruby ruby-dev g++
sudo aptitude install linux-libc-dev libswscale-dev libboost-dev
sudo gem install hornetseye-v4l2
sudo aptitude install xserver-xorg-dev libxv-dev libxpm-dev libgl1-mesa-dev libglu1-mesa-dev libswscale-dev libboost-dev
sudo gem install hornetseye-xorg

ここまではすんなり行って、こんな感じでカメラの画像を表示することができるようになる。

require 'rubygems'
require 'hornetseye_v4l2'
require 'hornetseye_xorg'
camera = Hornetseye::V4L2Input.new('/dev/video0'){|modes|
  modes.each_with_index { |mode,i| puts "#{i + 1}: #{mode}" }
  modes[ STDIN.readline.to_i - 1 ]
}
Hornetseye::X11Display.show { camera.read }

次は、それをファイルに保存するために、hornetseye-ffmpegをインストールする。これには、ffmpegを予め入れておく必要があり、そのためにdeb-multimediaをaptに加える。/etc/apt/source.listに

deb http://www.deb-multimedia.org jessie main non-free
deb-src http://www.deb-multimedia.org jessie main non-free

を加えて、

sudo aptitude update
sudo aptitude install deb-multimedia-keyring
sudo aptitude update
sudo aptitude install ffmpeg

とする。そして、いよいよhornetseye-ffmpegのインストールである。

sudo aptitude install libavformat-dev libswscale-dev libboost-dev
sudo gem install hornetseye-ffmpeg

これで、動画の保存もできるようになった。

require 'rubygems'
require 'hornetseye_v4l2'
require 'hornetseye_xorg'
require 'hornetseye_ffmpeg'
width,height=100,50
framerate=8
camera = Hornetseye::V4L2Input.new('/dev/video0'){|modes|
  modes.each_with_index { |mode,i| puts "#{i + 1}: #{mode}" }
  modes[ STDIN.readline.to_i - 1 ]
}
output = Hornetseye::AVOutput.new 'test.avi',
  4000000, width, height, framerate, 1, Hornetseye::AVOutput::CODEC_ID_MPEG4,false
Hornetseye::X11Display.show {
 img=camera.read 
 a=img.to_ubytergb
 b=a[0 ...  width, 0 ... height]
 output.write_video img
 b
}

何か、エラーが出ているけど、動くからいいか。