Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

raspberry Pi + カメラモジュールでストリーミング配信と顔認識

今回はラズパイとカメラモジュールを用いてストリーミング配信を行う方法についてまとめたいと思います!!
また、ストリーミング配信をサーバーに送りそこで顔認識とその結果を表示する部分についてもまとめます!!

■実行環境

 <ストリーミング配信>
・Raspberry Pi4

ラズベリーパイ 4 コンピューターモデルB 2GB Raspberry Pi 4 ラズパイ 4 TELEC認定取得済み 技適マーク入り

価格:7,478円
(2020/9/13 23:19時点)
感想(0件)

 ・カメラモジュール(LOGICOOL HDプロ ウェブカム C920)
   

【エントリーでポイント10倍!(9月11日01:59まで!)】【中古】PCハード ロジクール HDプロ ウェブカム C920n

価格:10,070円
(2020/9/13 23:14時点)
感想(0件)


 <ストリーミング受信+顔認証>
  ・PC(Windows10)
  ※PCにはpython3とOpenCVがインストール済みであること

簡単な構成はこちら。
f:id:Elsammit:20200913222309p:plain

■ラズパイでのストリーミング配信

ラズパイでストリーミング配信を行うにあたり、
カメラの映像をストリーミング配信するためのライブラリである「mjpeg_streamer」を用いました。

まずはインストールです。
こちらを実行。

mkdir ~/mjpg-streamer
cd ~/mjpg-streamer
sudo apt-get install 
sudo apt-get install cmake libjpeg8-dev
sudo git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
sudo make
sudo make install

やっていることは、githubに上がっているソースコードをcloneしてコンパイルとインストールを行っているだけです。

次にこちらを実行!!

mjpg_streamer -o "/usr/local/lib/mjpg-streamer/output_http.so -w ./www -p 8080" -i "/usr/local/lib/mjpg-streamer/input_uvc.so -d /dev/video0 -r 640x480 -fps 30 -q 10 -y -n"

実行した結果、こちらのようなログが表示されたら、

 i: Using V4L2 device.: /dev/video0
 i: Desired Resolution: 640 x 480
 i: Frames Per Second.: 30
 i: Format............: YUYV
 i: JPEG Quality......: 10
 i: TV-Norm...........: DEFAULT
 o: www-folder-path......: ./www/
 o: HTTP TCP port........: 8080
 o: HTTP Listen Address..: (null)
 o: username:password....: disabled
 o: commands.............: enabled

ブラウザ上でhttp://ラズパイのIPアドレス:8080/?action=streamにアクセスすると、
ストリーミング配信の確認が行えます。

■ストリーミング配信された動画から顔認識

ストリーミング配信を受けて、顔認証するソースはこちら。
※カスケードファイル(haarcascade_frontalface_default.xml)は下記ソースと同フォルダに格納しておいてください。

import cv2

# ストリーミング配信されるリンクを指定.
cap = cv2.VideoCapture("リンクパス")
cascade_path = "haarcascade_frontalface_default.xml"


# リンクが開けなかった場合
if not cap.isOpened():
    print("Cannot open a video capture.")
    exit(-1)


while True:
    # 送られてくる映像のフレームを取得.
    ret, frame = cap.read()

    # RGBからGray画像に変換.
    gry_img = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    
    # カスケードファイル読み込み.
    cascade = cv2.CascadeClassifier(cascade_path)

    facerect = cascade.detectMultiScale(gry_img,scaleFactor=1.5,minNeighbors=2,minSize=(30,30))

    # 顔認証部分を囲う色の指定.
    rectange_color = (255,0,0)

    # 顔認識部分を四角で囲う.
    if len(facerect) > 0:
        for rect in facerect:
            cv2.rectangle(frame,tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]),rectange_color,thickness=2)


    # もしフレームが取得できなかった場合
    if not ret:
        continue

    # フレームを表示する
    cv2.imshow("EV3 Streaming", frame)

    # escキーが押されたらループ終了
    k = cv2.waitKey(1)

    if k == 27:
        break

# キャプチャーの開放&ウィンドウ閉じる
cap.release()
cv2.destroyAllWindows()

■最後に

ラズパイからのカメラモジュールから取得した映像をストリーミング配信を行う方法と、
ストリーミング結果を受けたサーバが顔認識結果をimshowでサーバ上に表示する方法をまとめました。

ただ、、、サーバ上で見れるのではなく顔認識等の結果をフロントエンドで見れるようにしたほうが汎用性高いですね。
ということで、近いうちにサーバにて顔認識した結果をフロントエンドへの送信方法についてもまとめたいと思います!!