ラズベリーパイに接続されたカメラからストリーミング配信をし、 そこから受け取ったストリーミングから顔認識、顔認証をやりたい。
というわけで、まず初めにラズパイのストリーミング配信手段の一つであるmjpg-streamerを動かしてみました。
環境は、「RASPBERRY PI 3 MODEL B、 RASPBIAN JESSIE、 Camera Module V2
」です。 ラズパイの中央あたりにカメラモジュールを接続するところがあるので、しっかりとカメラを接続しておきましょう。
まずはインストール手順から
インストール手順
アップデート
$ sudo apt-get update
$ sudo apt-get upgrade
カメラモジュールを有効に。
$ sudo raspi-config
ここから、5 Interfacing Options > P1 Camera > <はい>
を選択してenabled
にします。 その後、Tabキーを押してカーソルを下部に移動させ、<Finish>
を選択して終了。
ここで一旦ラズパイを再起動します。
必要なパッケージのインストール
$ sudo aptitude install libv4l-dev libjpeg8-dev imagemagick
mjpg-streamerをダウンロード
私はこういうのはLibrariesフォルダにまとめてインストールしておりますので、ディレクトリを作成しました。
$ mkdir ~/Libraries
$ cd Libraries
$ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
mjpg-streamerをインストール
$ cd mjpg-streamer
$ make USE_LIBV4L2=true clean all
mjpg-streamerを立ち上げる
$ ./mjpg_streamer -i "./input_uvc.so -f 8 -r 640x360 -d /dev/video0 -y" -o "./output_http.so -w ./www -p 8080" &
フレームノートは「-f 8」のオプションの部分で変更できます。 ポート番号を変えるときは-pオプションの値を変更。 大きさを変える場合は-rオプションの値を変更。
input_uvc.soの-yオプションはつけておいた方がいいみたい。
動作確認
ラズベリーパイのブラウザなら、 http://localhost:8080
にアクセスしてmjpg-streamerのwebページが表示されれば成功です。
また、http://[IPアドレス]:8080
とアクセスすればLAN内であれば接続可能です。
ストリーミングのみ取得したい場合は http://localhost:8080/?action=stream
とURLに入力すればアクセスできます。
ちなみにこのwebページは、-wオプションの./www配下に置かれているhtmlが読み込まれています。
次回からの起動
$ cd ~/Libraries/mjpg-streamer/mjpg-streamer
$ ./mjpg_streamer -i "./input_uvc.so -f 8 -r 640x360 -d /dev/video0 -y" -o "./output_http.so -w ./www -p 8080" &
でmjpg-streamerを起動できます。
エラー発生時の対処法
ERROR opening V4L interface: No such file or directory
i: Using V4L2 device.: /dev/video0
....
....
ERROR opening V4L interface: No such file or directory
Init v4L2 failed !! exit fatal
i: init_VideoIn failed
/dev/video0がないと怒られる場合は、モジュールをロードして/dev/video0を作成
$ sudo modprobe bcm2835-v4l2
参考
以下のサイトの情報を参考にさせていただきました、ありがとうございました。
- WEBカメラで動画ストリーミング
- 第43回「Raspberry Pi Zero V1.3+カメラモジュールでミニ定点カメラを作ろう!」
- カメラでビデオストリーミング
- Raspberry PiのCamera moduleとWebカメラでStreamingを行う
余談
PythonとOpenCV3でストリーミング映像をキャプチャする方法
こちらのサイトの情報を参考に、mjpg-streamerのストリーミングをpython + opencv 3.1.0で読み取ろうとした
のですが、 上手くいきませんでした。
opencvは前記事の通り、動画が読み込めるようソースコードをダウンロードして、モジュールを追加する形でインストールしています。 ($ pip install opencvとかだと、動画の読み込み機能がない状態でインストールされるみたいです。嘘だったらごめんなさい。)
RASPBERRY PI 3 MODEL B + RASPBIAN JESSIE環境にOPENCV3.1.0をインストール
これでも読み取れない・・・何が悪いのか分からないっす。 ちなみにソースコードはこういう感じで書きました。
# -*- coding: utf-8 -*-
import cv2, sys
import numpy as np
URL = "http://[IPアドレス]:8080/?action=stream"
cap = cv2.VideoCapture(URL)
fps = 15
size = (314,240)
cap.set(3, size[0]) # Width
cap.set(4, size[1]) # Heigh
cap.set(5, fps) # FPS
while(cap.isOpened()):
ret, frame = cap.read()
if type(frame).__module__ == np.__name__:
cv2.imshow('Stream Video',frame)
else:
cv2.imshow('frame', 0)
key = cv2.waitKey(1) & 0xff
if key == ord('q'): break
cap.release()
cv2.destroyAllWindows()
$ python from_rasp_stream.py
WARNING: Couldn't read movie file http://[ipアドレス]:8080/?action=stream
実行すると、URLのストリームが読み取れないと怒られる。 他色々探しても有効な解決策がなく、mjpg-streamerのストリーミングをpython, opencvで拾って加工する方法は一旦諦めようかなと思います。 誰か、何か知っている人いたら是非コメントください、困ってます。
pythonとopencvで扱えるストリーミング手法を調査しなきゃ。