pythonのインストール確認
MediaPipeのインストール前に、以下の手順でpythonがちゃんと入っているかどうか確認します。
- Windowsキーを押しながら「R」キーを押し、「ファイル名を指定して実行」のウィンドウを出す。
- 「cmd」と入力、Enter、コマンドラインを起動する。
- 「python -V」と入力。(Vは大文字)
バージョン名が表示されればpythonは無事インストールされています。
venvの利用
そのままOpenCVとMediaPipeを入れても良いですが、ライブラリをインストールする環境を分けたい場合はvenvを使うと良いでしょう。もちろんそのまま次のセクションへ行っても構いません。具体的な手順は以下です。
- Win+r, cmdで起動されるコマンドラインはカレントディレクトリがユーザーディレクトリなので、その下に「…\python\venv\」というディレクトリを作り、仮想環境を利用する。
- 「mkdir python」「cd python」—>pythonディレクトリへ移動。
- 「mkdir venv」「cd venv」 —>更にその下にvenvディレクトリを作って移動。
- そこで「python -m venv .\Mediapipe」
- 「.\Mediapipe\Scripts\Activate」 —>仮想環境を実行。
コマンドラインではTabキーによる補完機能を利用しましょう。例えば
「Win+r, cmd, cd py(Tab), \, v(Tab), (Enter)」「m(Tab), \, s(Tab), \, a(Tab), (Enter)」…という具合です。
OpenCVとMediaPipeのインストール
画像処理ライブラリのOpenCVとAIライブラリのMediaPipeを入れます。ネットワークの通信速度が十分あれば、あっさり終わります。
- 「pip install opencv-python」と入力、OpenCVをインストール。
- 「pip install mediapipe」と入力、MediaPipeをインストール。
- もちろん「pip install opencv-python mediapipe」と一度に入れても構いません。
動作確認とエラー修正など
pythonをインタラクティブモードで起動して、
- import cv2
- import mediapipe
と打ち込んでエラーが出なければOKです。もしMediaPipeに関して、Protobufについてのエラーが出たら、
- pip install –upgrade protobuf==3.20.0
と打ち込んでバージョンを揃えます。(まっさらなWindows11で試したら上記エラーが出ました。)
サンプルプログラムの実行
公式ページのサンプルを抜粋したものを以下に記します。コマンドプロンプトからメモ帳を起動して、コピペして、保存して、実行しましょう。
- Win+r、cmd、コマンドプロンプトを起動して適当なディレクトリに移動。
- notepad mediapipe_test.py と打ち込んで「新しく作成しますか?」に「はい」と答える。
- サンプルをコピペして保存。Shiftキーとクリックなどで適宜選択して、Ctrl+c、Ctrl+v、Ctrl+s。
- もしvenvを使って仮想環境を構築している人で上記インストール作業と、このサンプルプログラムの実行の間が開いてしまった人はここで
「….\python\venv\Mediapipe\Scripts\Activate」 の実行を忘れずに。 - 準備ができたらmediapipe_test.pyのファイルの見えるディレクトリで
python mediapipe_test.py を実行します。 - ちなみにコマンドプロンプトで「start .(ピリオド)」とするとカレントディレクトリをエクスプローラで開いてくれますので、GUIでファイル操作した方が楽な方はエクスプローラでやりましょう。
サンプルコードは単にスケルトン描画してくれるだけですが、2011年~あたりのKinectとかの時代を知っている人は「こ、こんなに簡単に!?」と驚きます。時代ですねぇ。
poseのサンプルコード抜粋
import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose
# For webcam input:
cap = cv2.VideoCapture(0)
with mp_pose.Pose(
min_detection_confidence=0.5,
min_tracking_confidence=0.5) as pose:
while cap.isOpened():
success, image = cap.read()
if not success:
print("Ignoring empty camera frame.")
continue
image.flags.writeable = False
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = pose.process(image)
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
mp_drawing.draw_landmarks(
image,
results.pose_landmarks,
mp_pose.POSE_CONNECTIONS,
landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style())
# Flip the image horizontally for a selfie-view display.
cv2.imshow('MediaPipe Pose', cv2.flip(image, 1))
if cv2.waitKey(5) & 0xFF == 27:
break
cap.release()
人体モデルを検出するposeの場合は、以下のように配列の番号が決まっているみたいです。公式ページより抜粋。

FaceMeshのサンプルコード抜粋
ついでにFaceMeshのカメラ入力用の部分だけを以下に記します。ESCキーで終了します。
import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_face_mesh = mp.solutions.face_mesh
drawing_spec = mp_drawing.DrawingSpec(thickness=1, circle_radius=1)
cap = cv2.VideoCapture(0)
with mp_face_mesh.FaceMesh(
max_num_faces=1,
refine_landmarks=True,
min_detection_confidence=0.5,
min_tracking_confidence=0.5) as face_mesh:
while cap.isOpened():
success, image = cap.read()
if not success:
print("Ignoring empty camera frame.")
continue
image.flags.writeable = False
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = face_mesh.process(image)
# Draw the face mesh annotations on the image.
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
if results.multi_face_landmarks:
for face_landmarks in results.multi_face_landmarks:
mp_drawing.draw_landmarks(
image=image,
landmark_list=face_landmarks,
connections=mp_face_mesh.FACEMESH_TESSELATION,
landmark_drawing_spec=None,
connection_drawing_spec=mp_drawing_styles
.get_default_face_mesh_tesselation_style())
mp_drawing.draw_landmarks(
image=image,
landmark_list=face_landmarks,
connections=mp_face_mesh.FACEMESH_CONTOURS,
landmark_drawing_spec=None,
connection_drawing_spec=mp_drawing_styles
.get_default_face_mesh_contours_style())
mp_drawing.draw_landmarks(
image=image,
landmark_list=face_landmarks,
connections=mp_face_mesh.FACEMESH_IRISES,
landmark_drawing_spec=None,
connection_drawing_spec=mp_drawing_styles
.get_default_face_mesh_iris_connections_style())
cv2.imshow('MediaPipe Face Mesh', cv2.flip(image, 1))
if cv2.waitKey(5) & 0xFF == 27:
break
cap.release()