ラズベリーパイに接続されたカメラからストリーミング配信をし、 そこから受け取ったストリーミングから顔認識、顔認証をやりたい。

というわけで、まず初めにラズパイのストリーミング配信手段の一つである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

参考

以下のサイトの情報を参考にさせていただきました、ありがとうございました。

余談

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で扱えるストリーミング手法を調査しなきゃ。