はじめに
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)
出力結果の画面キャプチャ
おわりに
- カスケード分類器を使った顔検出はいかがでしたか?
- カスケード分類器は容易に使うことはできますが、精度が低いことが現状です。精度を高めたい方は自分で機械学習することをおすすめします。