Raspberry Piでカメラ画像を処理するのにはOpenCVを使ってみます。
Raspberry PiでOpenCVを使えるようにする方法は、以下を参照してください。
Raspberry PiでOpenCVをrubyで使ってみた
そして、画像でデータを受け取るfluentdの方の設定については以下を参照してください。
fluentdに画像データを送ってみる
ここでは、Raspberry Piでカメラデータを取得して、fluentdにデータを送る部分を紹介します。
Raspberry Piでfluentdにデータを送れるようにするためにfluent-loggerをインストールします。
sudo gem install fluent-logger
カメラ画像をfluentdに送るプログラムは以下のような感じです。
vi send_image.rb
require 'opencv' require 'fluent-logger' require 'base64' log = Fluent::Logger::FluentLogger.new(nil, :host=>'fluentdが起動しているホスト', :port=>24224) cap = OpenCV::CvCapture.open loop do #撮影間隔を以下のsleepで調整 sleep 1 img = cap.query #おくる画像のサイズを指定する場合は、以下のコメントをとる #img = img.resize OpenCV::CvSize.new 640, 360 mat = img.to_CvMat data = Base64.encode64(mat.encode('.jpg').pack('C*')) unless log.post("exec_test.image", {"sender"=>"raspberry pi","image_data"=>data}) p log.last_error # You can get last error object via last_error method end end
これで
ruby send_image.rb
とすれば画像データをfluentdに送って、fluentd側では指定したディレクトリに画像を溜め込んでいきます。
そして、ため込んだ静止画データを利用して動画を作ってみたいと思ったわけです。
タイムラプスとかいうやつです。
ここからはRaspberry Pi側ではなく、fluentdが動いている側での作業になります。
静止画を動画に変換するためにffmpegを利用してみます。
なので、まずはインストールです。
yum --enablerepo=rpmforge install ffmpeg
ffmpegで静止画を動画に変換するには、ファイルに連番がついていないといけない模様です。
今回は、データを受け取った時間でファイル名が決まるようにしていたので、そのままでは使えません。
なので以下でファイル名を連番に変換します。
c=1 ; for i in *.jpg ; do ln $i img`printf %06d $c`.JPG ; c=$((c+1)) ; done
ファイル名を連番にできたら、以下を実行して動画に変換します。
ffmpeg -r 15 -i img%06d.JPG out.avi
ネットワークさえつながればRaspberry Piのディスク容量を気にすることなく、いっぱい撮影をすることができるようになります。
データの送る方法としてfluentdを利用するのが最適なのか?という疑問はありますけどね。
0 件のコメント:
コメントを投稿