Welcome to Mashykom WebSite




Raspberry Piで画像処理

AIを搭載したロボットを自作してみようと思い立って、Raspberry Piをロボットのコンピュータボードとして活用することにしました。OSとしてRaspbian-stretch(kernel 4.5)がインストールされていることを前提とします。RaspberryPiの基本的なセットアップは完了しているとします。ssh接続及びVNCViewerを用いたデスクトップの表示が可能になっていると想定します。

 このページでは、最初に、Webカメラを用いた映像のキャプチャーの仕方についても説明します。MJPG-streamerというソフトのインストールを合わせて説明します。その次に、OpenCVをインストールして、Webカメラからの映像の画像処理法について説明します。なお、Webカメラの代わりに、PiCameraを用いても同じく正常に作動します。PiCameraでも解像度が低くなりますが同様の結果が得られます。PiCameraを使用するときは、「Raspberry Piの設定」の「インターフェース」で「カメラ」をEnable(有効)に設定しておきます。

Last updated: 2018.9.14


web cameraから動画をストリーミング配信する


MJPG-streamerを用いたストリーミング配信

 Raspberry Pi と、WEBカメラ (PiCamera)があれば、簡単に動画ストリーミングを行うことができます。ソフトウェアとしては、MJPG-streamerを使用します。WEBカメラとして、ここでは、LOGICOOL C310を用いています。

 最初に、MJPG-streamerのインストールを行います。ターミナルからssh接続で、Raspberry Piに接続してください。最新のパッケージリストを取得します。以下のコマンドを入力してください。


sudo apt-get update

 続いて、MJPG-streamer に必要なパッケージである、subversion、libjpeg-dev、imagemagick、をインストールします。以下のコマンドを実行します。


sudo apt-get install subversion libjpeg-dev imagemagick

 MJPG-streamerのソースファイルの取得とコンパイルを行うために、以下のコマンドを実行します。


svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
cd mjpg-streamer
make

 WEBカメラを、Raspberry Pi に接続します。以下のコマンドを実行し、MJPG-streamer を起動します。


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

パラメーターは必要に応じて変更します。
-f : frame rate : ストリーム動画のフレームレート(1秒あたりのフレーム数)を指定します。(例:-f 10)
-r : resolution : ストリーム動画の解像度を指定します。(例: -r 320x240)
ウェブのIPのポート番号が8080となっています。

次回以降、


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

と入力し、mjpg-streamerを立ち上げます。停止は[Ctrl+c]で終了します。

 Webブラウザを起動し、Raspberry Pi のポート8080にアクセスすると、以下のようなwebページが表示されます。

mjpg_streamer.png

この画面上でStreamの項をクリックすると、web cameraの映像が表示されます。

 長いコマンド文を毎回入力することは煩雑なので、以下のようなshスクリプトを作成します。


#!/bin/sh
# This is Web-streaming server start up script.for raspi

cd mjpg-streamer
sudo ./mjpg_streamer -i "./input_uvc.so -f 15 -r 640x320 -d /dev/video0 -y -n" -o "./output_http.so -w ./www -p 8080"

echo "mjpg_streamer started"

このコードをstream.shという名前で、ホームディレクトリに保存してください。webカメラを使用する前に、


cd sh ./stream.sh

とコマンドを入力すれば、


pi@raspberrypi:~ $ sh ./stream.sh
MJPG Streamer Version: svn rev: 3:172
 i: Using V4L2 device.: /dev/video0
 i: Desired Resolution: 640 x 320
 i: Frames Per Second.: 15
 i: Format............: YUV
 i: JPEG Quality......: 80
i: The format asked unavailable, so the width 640 height 360 
 o: www-folder-path...: ./www/
 o: HTTP TCP port.....: 8080
 o: username:password.: disabled
 o: commands..........: enabled

と返ってきます。mjpg-streamerが立ち上がります。PCあるいはスマホのWebブラウザを起動し、Raspberry Pi のポート8080にアクセスすると、mjpg-streamerのwebページが表示されます。終了は[Ctrl+c]です。

ラズパイのデスクトップで映像を表示させるケース

VNCviewerを使用しているときは、cheeseというソフトを用います。以下のように、インストールします。


$ sudo apt-get update 

$ sudo apt-get install cheese

続行しますか? [Y/n]と聞いてくるので、Yと入力します。数分後に、インストールが完了します。

 インストール後、RaspberryPiのデスクトップから、GUIのメニューのSound&Video(サウンドとビデオ)の項目からcheeseを起動します。起動するまでに数分かかりますので、少々待っているとカメラからの画像が表示されます。


Webカメラからの映像をOpenCVで画像処理する


 OpenCVをインストールしましょう。WebカメラをPCのusbコネクターに接続してください。webカメラの代わりにPiCameraを使用しても正常に作動します。

 PCのターミナルからラズパイにssh接続してください。または、VNC接続でラズパイのデスクトップのターミナルから、以下のようなコマンドを入力します。


$ sudo apt-get update
$ sudo apt-get install python-opencv

終了するまでに、数分かかります。

 以下のpythonコードを作成して、video.pyという名前で保存してください。


#!/usr/bin/env python

import cv2

s_video = cv2.VideoCapture(0)

while True:
  ret, img = s_video.read()
  cv2.imshow("Stream Video",img)
  key = cv2.waitKey(1) & 0xff
  if key == ord('q'): break 
  
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

保存するディレクトリはopencvという名称にしましょう。

 Webカメラからの映像をOpenCVを使って、ラズパイのデスクトップに表示しましょう。VNC Viewerを起動して、ラズパイに接続してください。ラズパイのデスクトップが表示されたら、ターミナルを起動します。ターミナルで、


$ cd opencv
$ python video.py

と入力します。1度目には、エラーが出るかもしれませんが、何度か試みてください。以下のような映像が表示されます。

opencv1.JPG

映像の表示を終了するときは、画像上で[q]キーあるいはターミナルで[Ctrl+c]を入力します。

 Webカメラからの映像に対するOpenCVを用いた画像処理の手続きは、PythonをインストールしたPCでの処理方法と同じです。具体的な内容については、 OpenCVで画像処理のページ を読んでください。

 例えば、顔認識をするプログラムは以下のように作成できます。まず、学習済のHaar-like特徴を用いた分類器のデータ(xmlファイル)をインストールします。xmlファイルの場所がわからない場合は、以下のGItHubのレポジトリhttps://github.com/opencv/opencvからダウンロードしてください。

opencv/data/haarcascades
この中のディレクトリhaarcascades/にある、
正面の顔検出用: haarcascade_frontalface_default.xml、及び
瞳検出用: haarcascade_eye.xml
笑顔検出用: haarcascade_smile.xml

などをopencv/haarcascades/ディレクトリに置いてください。不必要なファイルは削除しても結構です。PCにインストール済みの同一のパッケージがあるときは、それをラズパイのopencv/haarcascades/ディレクトリにscpコマンドでコピーしてください。

 顔検出用のPythonスクリプトを作成します。以下のコードをopencvディレクトリにdetect.pyという名前で作成します。


import numpy as np
import cv2

face_cascade_path = "/home/pi/opencv/haarcascades/haarcascade_frontalface_default.xml"
eye_cascade_path = "/home/pi/opencv/haarcascades/haarcascade_eye.xml" 

face_cascade = cv2.CascadeClassifier(face_cascade_path)
eye_cascade = cv2.CascadeClassifier(eye_cascade_path)

image = cv2.imread('faces.jpg')
color = (255,0,0)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

cascade = cv2.CascadeClassifier(face_cascade_path)
facerect = cascade.detectMultiScale(gray, scaleFactor=1.3, 
                      minNeighbors =1,minSize=(1,1))
if len(facerect) > 0:
    for rect in facerect:
        cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]),color,thickness=2)
else:
    print("no face")

cv2.imshow("detected.jpg",image)

cv2.waitKey()
cv2.destroyAllWindows()

'faces.jpg'はopencvに保存されている画像です。detect.pyを実行します。


$ cd opencv
$ python detect.py

 顔にブルー枠のついた画像が表示されます。このスクリプトでは、目に窓枠をつける部分を省略していますので、目に枠は付いていません。終了するときは、画像上 で右上のxをクッリクするか、ターミナルで[Ctrl+c]を入力してください。画像のサイズによって画像表示が大きすぎて、全体像が見ないかもしれませんが、その時は画像をスクロールして見てください。

 同じように、Webカメラから映像の中から顔の検出もできます。詳しくは、「OppenCVで画像処理」のページを見てください。


Tensorflow Lite を用いて機械学習

トップページに戻る