しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Raspberry Pi 2 と USB カメラを使って撮影した画像を Azure Blob へアップロードする仕組みを作ってみた

大昔に買って全く使っていない LifeCam Cinema が転がっていたので、Raspberry Pi 2 に繋いでみました。

動くかどうかすら、まともに確認していない気がしました。

とりあえず USB で接続して lsusb コマンドで確認すると、ちゃんと認識されていました。

/dev/video0 としてアクセス可能なので、対応したアプリケーションから撮影は出来そうです。

motion のインストール

軽く検索してみると Raspberry Pi 2 で USB カメラを使う場合には、motion というアプリケーションをインストールする場合が多いみたいでした。

WebHome < Motion < Foswiki

OpenCV を使って、カメラの前で物体が動いた場合にスクリプトを実行したり、一定間隔でスナップショットを撮影したりと、かなり高機能なアプリケーションのようです。

インストールは apt-get でサクッと入ります。

sudo apt-get install motion

motion.conf を変更して、sudo motion を実行するとデーモンとして動作するようになります。

pid ファイル周りでエラーになった場合にはディレクトリが無いのが原因なので、あらかじめ作成して置けば問題無いです。以下のようなコマンドで作成しておきます。

sudo mkdir /var/run/motion
sudo chmod a+rwxt /var/run/motion

motion が動作し始めたら Motion JPEG としてストリーム配信されるので、ひとまず VLC Media Player でキャプチャ出来ているのかを確認しました。

Raspberry Pi 2 のポート 8081 から配信されるので、それを開くと再生出来ます。

スナップショットを Blob へアップロード

C# で Azure Storage Client を使ってアップロードするコードをサクッと用意しました。保存された画像のファイルパスは最初の引数として渡す形にするので、割とシンプルなコードになっています。

class Program
{
    static void Main(string[] args)
    {
        var filePath = args[0];

        var storageAccount = CloudStorageAccount.Parse("CONNECTION_STRING");

        var blobClient = storageAccount.CreateCloudBlobClient();

        var container = blobClient.GetContainerReference("snapshot");
        container.CreateIfNotExists();

        var blob = container.GetBlockBlobReference(Path.GetFileName(filePath));
        blob.UploadFromFile(filePath, FileMode.OpenOrCreate);
    }
}

Windows の Visual Studio でビルドして、その実行ファイルを Raspberry Pi 2 にコピーしました。

そして motion.conf の on_picture_save で mono を使って実行するように設定します。

%f でファイルパスが展開されます。

最後に motion を起動させると、1 分ごとにスナップショットを撮影するようにしているので、少し後に Blob へアップロードされていることが確認出来ます。

Blob にアップロードしてしまえば何とでもなるので、実家の自宅警備犬を監視するために設置してみたいですね。お盆で実家に帰った時に、自宅警備犬の監視カメラとして遊んでみようと思います。