0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MYJLabAdvent Calendar 2024

Day 17

OpenCVで人の顔をドナルドにする

Posted at

はじめに

MYJLab Advent Calender 2024の17日目を担当させていただく4年生です。
さて、今日は「OpenCVで人の顔をドナルドにする」ということで初心者にはハードルが高い機械学習の部分を"あるもの"で代用して誰でも簡単にできる手順を解説していきます。これを読み終わった後今回使った"あるもの"を自分で作ってみようと思ってもらえるよう頑張ります!

目標

  • OpenCVの予め用意された"あるもの" = "カスケード型分類器"を使って、顔検出して顔部分にドナルドの画像を貼り付ける

環境

今回はPythonを使います。

  • Windows 11 Home
  • Python 3.11.0
  • opencv-python 4.7.0

準備

カスケード分類器の準備

以下のリンクから学習済みのカスケード分類器をダウンロードします。
https://github.com/opencv/opencv/tree/master/data/haarcascades
今回はhaarcascade_frontalface_default.xml(正面からの顔を検出する分類器)をダウンロードして使いましょう!

[ここ重要]
分類器haarcascade_frontalface_default.xmlと検出したい画像(sample.jpg)は、pythonファイルは同じディレクトリに保存します。

コード

opencvをインストールする

pip install opencv-python

script

import cv2

# 顔検出器のパス
cascade_path = cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'

# 顔検出器の読み込み
face_cascade = cv2.CascadeClassifier(cascade_path)

# 上書きする画像の読み込み
overlay_image = cv2.imread('./sample![スクリーンショット 2024-12-02 102144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617886/8acf9699-c90f-f2b6-f666-e350e32b802e.png)
.png')

# カメラキャプチャの開始
cap = cv2.VideoCapture(0)

while True:
    # フレームの読み込み
    ret, frame = cap.read()

    if not ret:
        break

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

    # 顔の検出を行う
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(20, 20))

    # 検出された顔の領域に上書きする画像を配置
    for (x, y, w, h) in faces:
        # 上書きする画像のサイズを調整
        resized_overlay = cv2.resize(overlay_image, (w, h))

        # 顔の領域に上書きする画像を配置
        frame[y:y+h, x:x+w] = resized_overlay

    # 結果を表示
    cv2.imshow('Result', frame)

    # 'q'キーを押して終了
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# キャプチャの解放とウィンドウの破棄
cap.release()
cv2.destroyAllWindows()

#顔検出した画像を保存する 
cv2.imwrite('./sample_cascade.avi', frame)

出力結果の画面キャプチャ

スクリーンショット 2024-12-02 102144.png

おわりに

  • カスケード分類器を使った顔検出はいかがでしたか?
  • カスケード分類器は容易に使うことはできますが、精度が低いことが現状です。精度を高めたい方は自分で機械学習することをおすすめします。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?