長野エンジニアライフ

東京から長野に移住したエンジニアのブログです。🦒🗻⛰

Python + OpenCVで顔検出(1)〜リアルタイムカメラから検出〜

qiita.com 上の記事を参考にOpenCVで顔検出したときのメモ

仮想環境の準備

opencvEnvの環境をvenvで作成

$ python3 -m venv opencvEnv

# activate しておく
$ source opencvEnv/bin/activate

(opencvEnv)$  ...

openCVのインストール

pipでopenCVをイントール

(opencvEnv)$ pip install opencv-python

Collecting opencv-python
  Downloading https://files.pythonhosted.org/packages/e2/a9/cd3912ca0576ea6588095dce55e54c5f0efeb3d63fb88f16f4c06c0fac8d/opencv_python-4.1.2.30-cp36-cp36m-macosx_10_9_x86_64.whl (45.2MB)
    100% |████████████████████████████████| 45.2MB 721kB/s
Collecting numpy>=1.11.3 (from opencv-python)
  Using cached https://files.pythonhosted.org/packages/22/99/36e3408ae2cb8b72260de4e538196d17736d7fb82a1086cb2c21ee156ddc/numpy-1.17.4-cp36-cp36m-macosx_10_9_x86_64.whl
Installing collected packages: numpy, opencv-python
Successfully installed numpy-1.17.4 opencv-python-4.1.2.30
import cv2

顔検出のプログラム準備

face_ detect.pyを作成する

【face_ detect.py】

import cv2

if __name__ == '__main__':
    # 定数定義
    ESC_KEY = 27     # Escキー
    INTERVAL= 33     # 待ち時間
    FRAME_RATE = 30  # fps

    ORG_WINDOW_NAME = "org"
    GAUSSIAN_WINDOW_NAME = "gaussian"

    DEVICE_ID = 0

    # 分類器の指定
    cascade_file = "../xml/haarcascade_frontalface_alt2.xml"
    cascade = cv2.CascadeClassifier(cascade_file)

    # カメラ映像取得
    cap = cv2.VideoCapture(DEVICE_ID)

    # 初期フレームの読込
    end_flag, c_frame = cap.read()
    height, width, channels = c_frame.shape

    # ウィンドウの準備
    cv2.namedWindow(ORG_WINDOW_NAME)
    cv2.namedWindow(GAUSSIAN_WINDOW_NAME)

    # 変換処理ループ
    while end_flag == True:

        # 画像の取得と顔の検出
        img = c_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 = (0, 0, 225)
            pen_w = 3
            cv2.rectangle(img_gray, (x, y), (x+w, y+h), color, thickness = pen_w)

        # フレーム表示
        cv2.imshow(ORG_WINDOW_NAME, c_frame)
        cv2.imshow(GAUSSIAN_WINDOW_NAME, img_gray)

        # Escキーで終了
        key = cv2.waitKey(INTERVAL)
        if key == ESC_KEY:
            break

        # 次のフレーム読み込み
        end_flag, c_frame = cap.read()

    # 終了処理
    cv2.destroyAllWindows()
    cap.release()

分類器のファイルを取得

顔検出に使用するhaarcascade_frontalface_alt2.xmlを以下のサイトから取得し、任意の場所にファイルをダウンロードする。 ja.osdn.net

実行

face_ detect.pyを実行する。ターミナルからカメラのアクセス許可を求めらるので許可する。

(opencvEnv)$ python face_ detect.py

カメラで取得できる映像から顔検出することができる。カメラは[Esc]で強制終了できる。 opencv_動作確認

ソースコード

今回のソースコードは以下のリポジトリface_detect.pyから転載。

github.com