2014-06-05

Raspberry Piにつないだカメラの画像をfluentdに送ってみる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Raspberry Piにつないだカメラで撮影した静止画のデータを別のマシンのfluentdに送って、保存してもらうことを試して見ました。


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を利用するのが最適なのか?という疑問はありますけどね。


コメントを投稿