Raspberry Piで画像処理

Raspberry Piで画像処理 - OpenCV

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

 このページでは、最初に、Webカメラを用いた映像のキャプチャーの仕方についても説明します。MJPG-streamerというソフトのインストールを合わせて説明します。その次に、OpenCVをインストールして、Webカメラからの映像の画像処理法について説明します。

Last updated: 2018.9.14


関連記事
RaspberryPiへのRaspbian OS のインストール
RaspberryPiでIOT
RaspberryPiでDeep Learning
Movidius NCS + RaspberryPiでObject Detection
Ubuntu 16.04のインストール:RaspberryPi
ROS(Robot Operating System)のインストール
Deep Learningと人工知能
PythonのTutorials/Jupyter Notebook
Python Tutorials: applications
My GitHub repositories

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

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

Raspberry Pi と、WEBカメラ をがあれば、簡単に動画ストリーミングを行うことができます。ソフトウェアとしては、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.pdf
この画面上で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コネクターに接続してください。
  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 video.py
顔にブルー枠のついた画像が表示されます。このスクリプトでは、目に窓枠をつける部分を省略していますので、目に枠は付いていません。終了するときは、画像上 で右上のxをクッリクするか、ターミナルで[Ctrl+c]を入力してください。画像のサイズによって画像表示が大きすぎて、全体像が見ないかもしれませんが、その時は画像をスクロールして見てください。
  同じように、Webカメラから映像の中から顔の検出もできます。詳しくは、「OppenCVで画像処理」のページを見てください。

Raspberry Pi でDeep Learning

トップページに戻る