どーもこんにちは(´・ω・`)です。
前回、ラズベリーパイにVNC接続してOpenCVでカメラの起動に成功しました。
今回は更に、そのOpenCVで顔認識も追加していこうと思います。
bcm2835-v4l2 の自動化
前回ハマりました、bcm2835-v4l2 についてですが、やはりシャットダウンすると、無効になってしまい、OpenCVが機能しませんでした。
今回は、まず起動したときに自動的にbcm2835-v4l2 が実行される方法からやっていきます。
/etc/modules を開くと
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with “#” are ignored.i2c-dev
と書いてありますが、これは”ブートするときにロードするためのカーネルモジュール群” を書いておく場所になっています。Windowsでいうとスタートアップです。
ここにbcm2835-v4l2をいれればOKなのですが、このファイルは書き込み禁止なので、予め解除しておきます。
ファイル書き込み禁止を解除する
パーミッションを確認します。
pi@pi:/etc $ ls -l modules
-rw-r–r– 1 root root 203 3月 23 20:29 modules
スーパーユーザーsudoとしてチェンジモードchmodして、パーミッションを777にします。
pi@pi:/etc $ sudo chmod 777 modules
で、変更が成功したか確認すると
pi@pi:/etc $ ls -l modules
-rwxrwxrwx 1 root root 203 3月 23 20:29 modules
フルアクセスに変更されました。
その上で、チェンジディレクトリcd /etc/でvimでmodulesを開きます。
pi@pi:/etc $ vim modules
i2c-devの下にbcm2835-v4l2を追加して保存しましょう。
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with “#” are ignored.i2c-dev
bcm2835-v4l2
キャットで確認すれば
pi@pi:/etc $ cat modules
しっかりとbcm2835-v4l2が追加されているのがわかると思います。
本題:Opencvで顔認識をやってみる
基本的には、前回のコードに学習済みハールカスケードと顔認識した顔に四角い図形でマーキングをするスクリプトを追加するだけです。
まずhaarcascade_frontalface_alt2.xmlは/usr/local/share/OpenCV/haarcascades/ の中に入っているので、作業ディレクトリであるhome/pi/の中へコピーを作っておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
import numpy as np import cv2 if __name__ == '__main__': # グローバル変数を定義 ESC_KEY = 27 # Escキー INTERVAL= 33 # インターバル FRAME_RATE = 30 # フレームレートfps # ウィンドウ名称を定義 ORIGINAL_WINDOW_NAME = "original" GRAY_SCALE_WINDOW_NAME = "gray_scale" DEVICE_ID = 0 # 学習済みの分類器を定義 cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml") # カメラ映像を取得 cap = cv2.VideoCapture(DEVICE_ID) # 初期フレームを読み込む end_flag, frame = cap.read() height, width, channels = frame.shape # ウィンドウの準備 cv2.namedWindow(ORIGINAL_WINDOW_NAME) cv2.namedWindow(GRAY_SCALE_WINDOW_NAME) # 画像処理 while end_flag == True: # 画像の取得と顔の検出 img = frame img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) face_list = cascade.detectMultiScale(img_gray, minSize=(100, 100)) # 検出した顔に四角いマーキングを付ける for (x, y, w, h) in face_list: color = (100, 100, 225) # GBR line_width = 3 cv2.rectangle(img_gray, (x, y), (x+w, y+h), color, thickness = line_width) # フレームを表示 cv2.imshow(ORIGINAL_WINDOW_NAME, frame) cv2.imshow(GRAY_SCALE_WINDOW_NAME, img_gray) # Escキーで終了 key = cv2.waitKey(INTERVAL) if key == ESC_KEY: break # 次のフレーム読み込み end_flag, frame = cap.read() # 終了処理 cv2.destroyAllWindows() cap.release() |
以上、簡単ですね。