ラズベリーパイ入門講座5(カメラモジュールとOpenCVで顔検出)
2024年4月24日pythonのOpenCVライブラリとラズベリーパイのカメラモジュールを使用して、顔検出プログラムを作成します。
カメラ映像に人の顔が検出されたら、四角の図形で囲む処理を行います。
ここからの作業は、CPUファンが付いているラズベリーパイのケースを装着することを推奨します。
カメラ映像の表示、顔検出など処理が増えてくると、CPU負荷が増えるため、CPU温度が上昇します。
85℃以上になると、電源が落ちるので、ケースなしで使用する場合は、温度には注意が必要です。
プログラム内で、CPU温度を出力しながら、処理を行うと安全にテストができます
顔検出を行うための準備
顔検出を行うための準備をします。
今回は、OpenCVというライブラリを使用して、カメラ映像から顔検出を行います。
OpenCVとは、画像処理・画像解析および機械学習等の機能を持つオープンソースのライブラリのことです。
OpenCVを使用できるようにするために、パッケージのアップデートと必要なライブラリのインストールをしましょう。
LX Terminalで、順番にコマンド入力を行います。
$ sudo apt update
システムのすべてのパッケージを最新のバージョンにアップグレード
$ sudo apt full-upgrade -y
アップグレードが完了したら再起動します。
$ sudo reboot
$ 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
「haarcascade_frontalface_default.xml」をクリック
右上のダウンロードのアイコンをクリック
「haarcascade_frontalface_default.xml」ファイルがダウンロードできます。
ファイル転送が可能になることで、自分のパソコンで作成したpythonファイルや先ほどのデータ(haarcascade_frontalface_default.xml)を簡単にラズベリーパイ側に転送ができます。
それでは、WinSCPをインストールしましょう。
下記のURLからダウンロードしてください。
https://forest.watch.impress.co.jp/library/software/winscp/
ダウンロードファイルを実行して、インストールを行います。
インストール項目で変更する箇所はありません。
ラズベリーパイが起動していることを確認してください。
WinSCPを起動させて、「新しいタブ」をクリック。「ログイン」タブが表示されます。
転送プロトコルが「SFTP」になっているのを確認します。
「ホスト名」「ユーザー名」「パスワード」を入力して、「ログイン」ボタンを押します。
警告画面がでますが、「承認」をクリックします。
成功すれば、右側の画面にラズベリーパイのフォルダが表示されます。
これで、自分のパソコンのデータを、ラズベリーパイ側にドラッグすることで、データを簡単に転送することができるようになりました。
WinSCPを利用して、ラズベリーパイ内のディレクトリを編集します。
まずは、顔検出に必要なデータを配置するディレクトリ(フォルダ)を作成します。
今回は、「Desktop」の中に「face_detection」ディレクトリを作成します。
「Desktop」をクリックして、Desktop内に移動します。
「新規」→「ディレクトリ」をクリックして、「face_detection」ディレクトリを作成します。
「face_detection」ディレクトリの中に、顔検出用でダウンロードした「haarcascade_frontalface_default.xml」をドラッグして転送します。
顔検出プログラムの実行
顔検出プログラムを実行する準備ができたので、pythonファイルにコードを記述します。
記述後は、先ほど作成した「face_detection」ディレクトリの中にpythonファイルを移動してから、Thonnyで実行してください。
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() プレビュー画面を閉じる
このようにカメラ映像中に顔が検出できれば成功です。
現在のコードは、最低限の顔検出処理だけなので、処理を追加してみると勉強になるでしょう。
例)
・顔検出時の画像を保存する処理
・CPU温度を管理する処理
・スレッド処理(threading)を追加して、複数スレッドで別々の処理を行う