おもちゃラボ

Unityで遊びを作っていきます

【Raspberry Pi】ストリーミング配信した映像をOpenCVで受け取る

この記事ではRaspberry Piに接続したカメラの映像をストリーミング配信して、その映像をMacやPCで受け取る方法を紹介します。

f:id:nn_hokuson:20201116160445p:plain

Raspberry Piからのストリーミング映像はブラウザでも受け取れますが、ここではOpenCVで受け取る方法も合わせて紹介します。

Raspberry Piでストリーミング配信する

Raspberry Piに接続したカメラからストリーミング配信するにはmjpg-streamerを使用します。mjpg-streamerのインストール方法は次の記事のとおりです。

qiita.com

インストールのコマンドだけこちらにまとめておきます。

$ sudo apt-get install -y cmake libv4l-dev libjpeg-dev imagemagick
$ git clone https://github.com/jacksonliam/mjpg-streamer.git
$ cd mjpg-streamer/mjpg-streamer-experimental
$ sudo make; sudo make install

インストールができたら、次のコマンドでストリーミング配信を開始します。

sudo ./mjpg_streamer -i "./input_uvc.so -f 30 -r 320x240 -d /dev/video0 -y -n" -o "./output_http.so -w ./www -p 8080"

ストリーミング配信時に指定できる主なオプションは次のようになります。

オプション 意味
-d デバイス名
-r 解像度
-f フレームレート
-p ポート番号

ストリーミング配信動画を受けとる

ブラウザで動画を受け取る

まずは、Raspberry Piで配信したストリーミング映像がちゃんと表示されているか、ブラウザで確認してみましょう。ブラウザに

http://ラズパイのIPアドレス:8080/?action=stream

と入力してください。次のようにRaspberry Piに接続したカメラの映像が映っていればOKです。

f:id:nn_hokuson:20201116161057j:plain:w450

OpenCVで映像を受け取る

ストリーミングの映像が受け取れていることが確認できたら、次はOpenCVを使って映像を受け取ります。

OpenCVを使って映像を受け取るために、次のpythonプログラムを入力してください。

import cv2

url = "http://ラズパイのIPアドレス:8080/?action=stream"
video = cv2.VideoCapture(url)

while True:
    ret, frame = s_video.read()
    edges = cv2.Canny(frame,100,200)
    cv2.imshow("Test", edges)
    key = cv2.waitKey(1)
    if key == 27:
        break

OpenCVのVideoCaptureの引数にストリーミング配信元のURLを指定することで、動画を読み込むのと同じように映像をMat型で取得できます。上のサンプルでは取得した映像にCannyフィルタを掛けて出力しているので、次のような映像になりました。

f:id:nn_hokuson:20201116162150g:plain:w500
 

まとめ

Raspberry Piを使って映像を配信し、その映像をPC/MacからOpenCVで取得&表示する方法を紹介しました。