paroponの日記

興味のある技術の覚え書きです

raspberry piで監視カメラ - MotionPie -

MotionPieによるraspberry pi監視カメラ構築法を紹介します。MotionPieを使うことで、今までに比べて誰でも簡単に監視カメラが作れるようになった印象です。

今までは、raspberry piで監視カメラと言えばlinux用の監視カメラソフトウェアであるMotionを使うのが一般的でした。 Motionを使って監視カメラを構築する場合、emacsなどでMotion設定ファイルの編集、sambaのインストールなど、linuxを使ったことがない人には少しハードルがありました。

MotionPieもlinux監視カメラソフトウェアですが、MotionPie自体はlinuxディストリビューションであり、ディスクイメージとして配布されています。 簡単に説明すると、配布されているディスクイメージをSDカードに書き込み、起動すると即座にraspberry piを監視カメラとして利用できます。

MotionPieのインストールから設定などは、下記ページに一通り書かれています。 pimylifeup.com

英語のページなので、簡単に使い方を説明します。

まずこのページからディスクイメージをダウンロードし、解凍します。

Releases · ccrisan/motionpie · GitHub

raspberry piならmotionpie-raspberrypi-xxxxxxxx.img.gzを、raspberry pi2ならmotionpie-raspberrypi2-xxxxxxxx.img.gzをダウンロードします。それ以外にもbananapi用なんてのもあるようですね。

次に、SDカードをフォーマットし、ダウンロードしたディスクイメージをSDカードに書き込みます。SDカードの容量は8GB以上となってますが、システムの容量が小さいので試してみる程度であれば4GBでも問題ないのではないかと思います。Win32DiskImagerをダウンロードして、SDカードにディスクイメージを書き込みます。

Win32 Disk Imager download | SourceForge.net

raspberry piにディスクイメージを書き込んだSDカードをへ差し込み、有線LANケーブルを接続し、raspberry pi用カメラモジュール又はUSBカメラを接続し起動します。

以降のカメラ設定はwindows pcなどを利用してネットワーク経由で行います。

まず、起動したraspberry piのコンピュータ名を調べます。windowsであれば、ネットワークコンピュータを開き、MP-E28D9CE5のような名前のコンピュータを探します。出てきた名前がコンピュータ名です。

次に、ブラウザからhttp://MP-E28D9CE5にアクセスします。この時、internet explorerではだめで、私はFireFoxでアクセスできました。

ログイン画面が表示されるので、usernameをadmin、passwordを空白でログインします。

カメラの映像が表示されたでしょうか。

f:id:paropon:20150905235345j:plain

ここでは、raspberrypiカメラモジュールとUSBカメラの2台を接続しています。2台目は左上のCamera1の部分をクリックしてadd camera..を選択して追加します。

ログインパスワードの設定

administrator Passwordには空白ではなくパスワードを設定しておきましょう。あとで録画された映像を見るときパスワードを設定しておかないとみることができません(正確にはraspberry piのシリアル番号で見ることができるそうですが、シリアル番号とは何なのか不明です。素直に設定しましょう)。

動体検知の有効化

動きがあるときに録画を行うには、Motion Moviesの左にあるスイッチをONにします。 Preserve Moviesでは、録画映像の保存期間を選択します。保存期間を過ぎると録画映像は削除されます。

f:id:paropon:20150906220738j:plain

Applyボタンをクリックすると変更内容が適用されます。

録画映像の見方

保存された映像を見るには、ファイルエクスプローラのアドレス欄に\\MP-E28D9CE5と入力し、sdcardフォルダにアクセスします。 パスワードを求められるので、先ほど設定したAdministrator UsernameとAdministrator Passwordを入力します。

これで保存された映像ファイルを開くことができるようになります。メディアプレーヤなどで見ましょう。

詳細設定

詳細な設定は、Show Advanced SettingsをONにするとできるようになります。 シャットダウンやリブートもShow Advanced SettingsをONにするとできるようになります。いろいろやってみましょう。

今までMotionではすべて設定ファイルで行っていたので、今回webブラウザ上でできるようになりとても便利になりました。ソースコードはチェックしていませんが、設定内容を見る限りMotionと同じものが多いので、内部ではMotionを使っているものと思われます。名前もMotionPieなのでおそらく間違いないでしょう。

MotionPieは非常に便利そうなのですが、linuxの知識がある場合はraspbisnベースで自由にシステム構築をしたい場合があるかもしれません。この場合はMotionPieではなく、同じ開発者によるmotioneyeというソフトもあるようです。後日こちらの使い勝手も試してみたいと思います。

raspberry pi motionの設定

raspberry piを監視カメラとして動作させるため、motionというソフトウェアを導入しました。

インストール

sudo apt-get install motion

設定ファイル

/etc/motion/motion.conf
daemon on
width 640
height 480
framerate 10
pre_capture 5
post_capture 2
gap 30
max_mpeg_time 180
output_normal off
ffmpeg_video_codec msmpeg4
target_dir /home/pi/share
movie_filename %Y%m%d/cam%t/%H%M%S
webcam_localhost off
control_localhost off


/etc/default/motion
start_motion_daemon=yes

起動

sudo service motion start

こんな感じの設定でraspberry pi 2では6fps程度で録画されます(画像の変化領域が大きいほど遅くなるようです)。

2015/09/09 追記
最近MotionPieというMotionの派生ソフトを見つけました。paropon.hatenablog.com

raspberry piのSSH設定

鍵の生成

WinSCPに付属でついてくるPuttygenを使って秘密鍵と公開鍵を作ります。
ここでは秘密鍵をid_rsa.ppk、公開鍵をid_rsa.pubとします。

raspberry piへ公開鍵の登録

sambaなどを使用して公開鍵id_rsa.pubを転送します。
ホームディレクトリへ.sshディレクトリを作り、パーミッションを700に設定します。
.sshディレクトリへ公開鍵id_rsa.pubを移動します。
puttygenで作った公開鍵をopenSSH形式に変更してauthorized_keysへ追記します。
% ssh-keygen -i -f id_rsa.pub >> authorized_keys
パーミッション変更しておきます。
% chmod 600 authorized_keys

SSHの設定

設定ファイルは/etc/ssh/sshd_config

PermitRootLogin no
RSAAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFileを有効化
PasswordAuthentication no

raspberry pi 無線LANの設定

interfacesで無線LAN接続設定をします。

sudo emacs /etc/network/interfaces

# (変更箇所のみ記載)
iface wlan0 inet dhcp
#iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

wpa_supplicant.confにSSID、パスワード情報を追記します。

sudo chmod 666 /etc/wpa_supplicant/wpa_supplicant.conf
sudo wpa_passphrase SSID PASS >> /etc/wpa_supplicant/wpa_supplicant.conf
sudo chmod 666 /etc/wpa_supplicant/wpa_supplicant.conf

最後にwpa_supplicant.confに平文パスワードが残っているので消します。

sudo emacs /etc/wpa_supplicant/wpa_supplicant.conf

OpenCVをスタティックリンク

OpenCVで作ったプログラムを別のPCで使おうとするといろんなDLLがないといわれてしまうので、スタティックリンクで使うメモです。
スタティックリンクにすることで実行ファイルのサイズは大きくなりますが、DLLのパスを通す必要がなくなります。

OS:Win8.1 64bit

Visual Studio 2013 Express

OpenCV 2.4.9

VCのDLLはこの記事の設定でスタティックリンクできるようです。

Visual C++が入っていないPCで実行 - インコのWindowsSDK

簡単にまとめると、プロジェクトのプロパティから構成プロパティ→C/C++→コード生成で、ランタイムライブラリをReleaseならマルチスレッドに、Debugならマルチスレッドデバッグに変更します。

OpenCVのスタティックリンクはこの記事を参考にさせていただきました。

【OpenCV】スタティックリンクライブラリの使用方法 | イメージングソリューション


私の環境では

Libcmt.lib;msvcprt.lib を無視する設定は不要でした。


ライブラリ周りの設定は少し変更しました。

//プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに
// opencv2のあるフォルダ(C:\opencv\build\includeなど)を追加のこと
#include "opencv2\opencv.hpp"

#pragma comment(lib,"comctl32.lib")
#pragma comment(lib,"vfw32.lib")

// バージョン名の取得
#define CV_VERSION_STR CVAUX_STR(CV_MAJOR_VERSION) CVAUX_STR(CV_MINOR_VERSION) CVAUX_STR(CV_SUBMINOR_VERSION)

// libファイル名の最後の部分をReleaseとDebugで分ける
#ifdef _DEBUG
#define CV_EXT_STR "d.lib"
#else
#define CV_EXT_STR ".lib"
#endif

//プロジェクトのプロパティ⇒リンカー⇒全般 の追加のライブラリディレクトリに
// libファイルのあるフォルダ(C:\opencv\build\x86\vc10\libなど)を追加のこと
#pragma comment(lib, "opencv_calib3d"  CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_contrib"  CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_core"  CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_features2d"  CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_flann"  CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_gpu"  CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_highgui"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_imgproc"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_legacy"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_ml"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_nonfree"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_objdetect"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_ocl"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_photo"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_stitching"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_superres"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_ts"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_video" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_videostab" CV_VERSION_STR CV_EXT_STR)

#pragma comment(lib, "zlib" CV_EXT_STR)
#pragma comment(lib, "IlmImf"   CV_EXT_STR)
#pragma comment(lib, "libjasper"CV_EXT_STR)
#pragma comment(lib, "libjpeg"  CV_EXT_STR)
#pragma comment(lib, "libpng"   CV_EXT_STR)
#pragma comment(lib, "libtiff"  CV_EXT_STR)

これでビルドまでできました。

基本的な動作も確認できました。が、、

DLL版では読み込めるAVIファイルのロードができませんでした。

    cv::VideoCapture cap(filename);
    if (!cap.isOpened())
    {
        printf("can't avi open\n");
        return;
    }


このあたりが似た問題かなと思いつつ
OpenCV VideoCapture fails to load compressed video files when building with staticlib - Stack Overflow

build\x64\vc12\binディレクトリにある
opencv_ffmpeg249_64.dll
をexeと同じ場所に置く必要があるようです。
これもスタティックリンクできないものか。。

Altera DE1 Board

Altera DE1 Boardでいろいろやってみたいと思っています。

 

QuartusII web edition 13.0sp1をインストール

(これ以降のバージョンはCyclone IIをサポートしていない)

http://dl.altera.com/13.0sp1/?edition=web

 

付属サンプルコードの信号波形を見てみたく、

QuartusIIからModelSim-Alteraを呼び出してシミュレーションするメモ

ここを参考にしました。

実験3A ModelSim によるシミュレーション (テストベンチなし)