前回、MediaPipeのFace Meshを使って動画に映っている人の顔を検出するプログラムを紹介しました。
今回はFace Meshで検出される特徴点について詳しく見ていきたいと思います。簡単なMediaPipeのプログラムを作って特徴点の番号を調べてみたので、今回はそのプログラムを紹介します。
MediaPipeのFace Meshは顔を468個の特徴点(ランドマーク)として捉えるのですが、顔のどこが何番目のランドマークになっているのかを知れば、目や口の開き具合や表情の変化をプログラム内で知ることができるようになります。
準備
必要なモジュールは前回同様、OpenCVとMediaPipeです。
|
1 2 3 |
pip install opencv-python pip install opencv-contrib-python pip install mediapipe |
プログラムの内容
このプログラムは、以下にあるようなface.pngという画像を読み込んで、ランドマーク番号の下1桁の数字が0~9の場合に分けて、10個の画像として出力するプログラムです。

|
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 |
import cv2 import mediapipe as mp import time mpDraw = mp.solutions.drawing_utils mpFaceMesh = mp.solutions.face_mesh faceMesh = mpFaceMesh.FaceMesh(max_num_faces=1) drawSpec = mpDraw.DrawingSpec(thickness=1, circle_radius=2) img = cv2.imread('face.png') imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) results = faceMesh.process(imgRGB) if results.multi_face_landmarks: for i in range(0, 10): img_copy = img.copy() for faceLms in results.multi_face_landmarks: mpDraw.draw_landmarks(img_copy, faceLms, mpFaceMesh.FACEMESH_CONTOURS, drawSpec, drawSpec) for id,lm in enumerate(faceLms.landmark): if id % 10 == i: ih, iw, ic = img_copy.shape x, y = int(lm.x*iw), int(lm.y*ih) cv2.putText(img_copy, str(id), (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1) cv2.imwrite(f'face_landmarks_{i}.png', img_copy) |
ソースコードはこちらからダウンロードできます。
出力結果
以下にランドマークの末尾番号(0~9)ごとにランドマークの番号を表示した画像を示します(それぞれクリックすると拡大します)。数字の左下にある〇が対応するランドマークです。
口や目の周辺はランドマークが密になっているので見えにくいところもありますが、どの点が何番目なのかは大体分かるかと思います。今回の内容が誰かのお役に立てば幸いです。
おしらせ
coconalaに出品しました。プログラム作成のご希望があればお気軽にお問い合わせください。
仕事を便利にするPythonプログラム作ります 「できたらいいな」を実現します- 投稿タグ
- プログラミング









