【Python】OpenCVで画像から顔検出するコード

こんばんは。
今回は、PythonでOpenCVを使用し、画像から顔検出を行うコードを紹介します。

まずはOpenCVをインストールします。
<Anacondaを使用している場合>

conda install -c conda-forge opencv


<main.py>

import cv2
import matplotlib.pyplot as plt
import datetime

def plot_and_save_faces(image_path, cascade_path):
    # 画像を読み込む
    image = cv2.imread(image_path)

    # 元画像のdpiを取得
    dpi = image.shape[0] / plt.gcf().get_figheight()

    # グレースケールに変換
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # 分類器を読み込む
    face_cascade = cv2.CascadeClassifier(cascade_path)

    # 顔を検出
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))

    # 画像を表示
    plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

    # カウンターの初期化
    count = 0

    # 検出された顔の周りに枠を描画
    for (x, y, w, h) in faces:
        rect = plt.Rectangle((x, y), w, h, fill=False, color='red')
        plt.gca().add_patch(rect)
        count += 1

    # 軸を非表示にする
    plt.axis('off')

    # 現在の日時を取得
    now = datetime.datetime.now()
    timestamp = now.strftime("%Y%m%d_%H%M%S")

    # 結果を保存
    output_path = f"result_{timestamp}.jpg"
    plt.savefig(output_path, dpi=dpi, bbox_inches='tight', pad_inches=0)

    # 保存した結果画像のパスを表示
    print("顔検出結果を保存しました:", output_path)
    print("検出された顔の数:", count)

    # 画像を表示
    plt.show()

# 画像ファイルのパス
image_path = "ABC.jpg"

# カスケード分類器のパス
cascade_path = cv2.data.haarcascades + "haarcascade_frontalface_alt2.xml"

# 顔検出結果をプロット上に表示し、結果画像を保存
plot_and_save_faces(image_path, cascade_path)


画像ファイルのパスは適宜変更してください。

すべての顔を検出できるわけではありませんので、ご注意ください。
検出した顔に赤枠を追加し、日時別のファイル名で保存します。
また、検出数もコンソールに表示させています。

この記事が気に入ったらサポートをしてみませんか?