PcSchool.Club

パソコンを分かりやすく解説することを目指す無料のオンラインパソコン教室

岐阜のパソコン教室「パソコンスクール・テルン」

ラズベリーパイ入門講座5(カメラモジュールとOpenCVで顔検出)

2024年4月24日

pythonのOpenCVライブラリとラズベリーパイのカメラモジュールを使用して、顔検出プログラムを作成します。
カメラ映像に人の顔が検出されたら、四角の図形で囲む処理を行います。
ここからの作業は、CPUファンが付いているラズベリーパイのケースを装着することを推奨します。

ラズベリーパイケース

カメラ映像の表示、顔検出など処理が増えてくると、CPU負荷が増えるため、CPU温度が上昇します。
85℃以上になると、電源が落ちるので、ケースなしで使用する場合は、温度には注意が必要です。
プログラム内で、CPU温度を出力しながら、処理を行うと安全にテストができます

顔検出を行うための準備

顔検出を行うための準備をします。
今回は、OpenCVというライブラリを使用して、カメラ映像から顔検出を行います。
OpenCVとは、画像処理・画像解析および機械学習等の機能を持つオープンソースのライブラリのことです。

OpenCVを使用できるようにするために、パッケージのアップデートと必要なライブラリのインストールをしましょう。
LX Terminalで、順番にコマンド入力を行います。

1.システムのパッケージをアップデート
APTパッケージリストを最新のものに更新
$ sudo apt update

システムのすべてのパッケージを最新のバージョンにアップグレード
$ sudo apt full-upgrade -y

アップグレードが完了したら再起動します。
$ sudo reboot


2.ライブラリのインストール
pipを最新のバージョンにします。
$ sudo python -m pip install –upgrade pip

OpenCVをインストールします。
$ pip install opencv-python

numpyライブラリを最新のバージョンにアップグレード
$ sudo pip install -U numpy

「libatlas3-base」 パッケージをインストールします。
$ sudo apt install libatlas3-base


3.顔検出に必要なデータをダウンロードする
OpenCVでは、顔や目などを検出できるカスケード分類器の学習済みファイルが事前に用意されています。
今回は、顔を検出できる「haarcascade_frontalface_default.xml」ファイルを使用します。
学習済みファイルは、下記のリンクからダウンロードできます。
https://github.com/opencv/opencv/tree/4.x/data/haarcascades

haarcascade_frontalface_default.xmlのダウンロード1

「haarcascade_frontalface_default.xml」をクリック

haarcascade_frontalface_default.xmlのダウンロード2

右上のダウンロードのアイコンをクリック
「haarcascade_frontalface_default.xml」ファイルがダウンロードできます。


4.WinSCPをダウンロードする
自分のパソコンとラズベリーパイ間でファイル転送を行うためのソフトをインストールします。
ファイル転送が可能になることで、自分のパソコンで作成したpythonファイルや先ほどのデータ(haarcascade_frontalface_default.xml)を簡単にラズベリーパイ側に転送ができます。
それでは、WinSCPをインストールしましょう。

下記のURLからダウンロードしてください。
https://forest.watch.impress.co.jp/library/software/winscp/

winscpのダウンロード

ダウンロードファイルを実行して、インストールを行います。
インストール項目で変更する箇所はありません。

ラズベリーパイが起動していることを確認してください。
WinSCPを起動させて、「新しいタブ」をクリック。「ログイン」タブが表示されます。

winscpのログイン

転送プロトコルが「SFTP」になっているのを確認します。
「ホスト名」「ユーザー名」「パスワード」を入力して、「ログイン」ボタンを押します。

winscp警告画面

警告画面がでますが、「承認」をクリックします。

winscpログイン完了

成功すれば、右側の画面にラズベリーパイのフォルダが表示されます。
これで、自分のパソコンのデータを、ラズベリーパイ側にドラッグすることで、データを簡単に転送することができるようになりました。

WinSCPを利用して、ラズベリーパイ内のディレクトリを編集します。
まずは、顔検出に必要なデータを配置するディレクトリ(フォルダ)を作成します。
今回は、「Desktop」の中に「face_detection」ディレクトリを作成します。
「Desktop」をクリックして、Desktop内に移動します。

winscpディレクトリ作成
winscpディレクトリ作成2

「新規」→「ディレクトリ」をクリックして、「face_detection」ディレクトリを作成します。
「face_detection」ディレクトリの中に、顔検出用でダウンロードした「haarcascade_frontalface_default.xml」をドラッグして転送します。

winscpデータ転送

顔検出プログラムの実行

顔検出プログラムを実行する準備ができたので、pythonファイルにコードを記述します。
記述後は、先ほど作成した「face_detection」ディレクトリの中にpythonファイルを移動してから、Thonnyで実行してください。

顔検出プログラム(face_detection.py)

import cv2
from picamera2 import Picamera2
from libcamera import controls

face_detector = cv2.CascadeClassifier(“haarcascade_frontalface_default.xml”)
cv2.startWindowThread()
pc2 = Picamera2()
pc2.configure(pc2.create_preview_configuration(main={“format”: ‘XRGB8888’, “size”: (640, 480)}))
pc2.start()

while True:
 img = pc2.capture_array()
 grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 faces = face_detector.detectMultiScale(grey, 1.1, 5)

 for (x, y, w, h) in faces:
  cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0))
 cv2.imgshow(“Camera”, img)
 key = cv2.waitKey(1)
 if key == 27:
  break
pc2.stop()
cv2.destroyAllWindows()

<解説>
CascadeClassifier() 顔検出用のカスケード分類器を読み込み
startWindowThread() OpenCVのGUIウィンドウ用のバックグラウンドスレッドを開始
configure(pc2.create_preview_configuration() プレビュー画面の設定を行っています
while whileループでカメラからのフレームをキャプチャしています。
cvtColor() キャプチャ画像をグレースケールに変換
face_detector.detectMultiScale(): カスケード分類器とグレースケール画像を利用して、顔検出します
for 顔が検出されたら、for文内で四角形(rectangle)を描画して顔の周りを囲みます
imshow() 画像をプレビュー画面に表示します。
waitKey(1) ESCキーを押すとwhileループから抜けます
pc2.stop() Picameraを停止
cv2.destroyAllWindows() プレビュー画面を閉じる

opencv顔検出

このようにカメラ映像中に顔が検出できれば成功です。
現在のコードは、最低限の顔検出処理だけなので、処理を追加してみると勉強になるでしょう。
例)
・顔検出時の画像を保存する処理
・CPU温度を管理する処理
・スレッド処理(threading)を追加して、複数スレッドで別々の処理を行う

関連サイト

パソコン教室

パソコンスクール・テルン岐阜・穂積・大垣教室 楽しく学ぶ・通うパソコン教室あもる

パソコン修理・販売・買取・サポート

パソコンの修理・販売・買取・サポート