「気づいたら背中が丸まって、首が画面に近づいていた…」なんてこと、ありますよね😅 長時間のコーディングセッションで、いつの間にか猫背モードに突入してしまうのは、エンジニアあるあるだと思います。
今回は、そんな慢性的な姿勢崩れをAIの力でリアルタイム検知してくれるシステムを自作する方法をご紹介します!使うのはMediaPipe Pose(Googleの姿勢推定ライブラリ)とElectron(デスクトップアプリフレームワーク)の組み合わせです。
🎯 この記事の対象読者・難易度

- ✅ Pythonの基本が書ける方(初〜中級者向け)
- ✅ コンピュータビジョンやAIに興味がある方
- ✅ 「むずかしそう」を「できそう」に変えたい方
🤖 MediaPipe Poseってどんなもの?
MediaPipe Poseは、Googleが開発したリアルタイム姿勢推定ライブラリです。カメラ映像から人体の関節(肩・腰・膝など)を33点自動検出してくれます。難しい機械学習の知識がなくても、数行のコードで骨格検出ができてしまうのが最大の魅力ですよ。
イメージとしては、カメラの前に座っているあなたの体に「見えない点」をどんどんマッピングしていく感じです📍
🛠️ 仕組みのざっくりした流れ
- Webカメラで映像をキャプチャ
- MediaPipeで肩・耳・腰の座標を取得
- 座標から姿勢の傾きを計算(角度チェック)
- しきい値を超えたらElectronアプリが通知を飛ばす
ざっくりとした流れがつかめましたか?では実際のコードを見てみましょう。
💻 Pythonで姿勢を検出するコアコード
まずはMediaPipeで姿勢を検出し、肩の傾き角度を計算する部分です。ここが姿勢判定のキモになります。
import cv2
import mediapipe as mp
import numpy as np
# MediaPipe Poseの初期化
mp_pose = mp.solutions.pose
mp_drawing = mp.solutions.drawing_utils
def calculate_angle(a, b, c):
"""3点の座標から角度を計算する関数"""
a = np.array(a) # 始点
b = np.array(b) # 中心点(関節)
c = np.array(c) # 終点
# ベクトルの角度をラジアンで計算 → 度数に変換
radians = np.arctan2(c[1] - b[1], c[0] - b[0]) - \
np.arctan2(a[1] - b[1], a[0] - b[0])
angle = np.abs(radians * 180.0 / np.pi)
if angle > 180.0:
angle = 360 - angle
return angle
def detect_posture(frame, pose):
"""フレームから姿勢を判定してステータスを返す"""
image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = pose.process(image)
if not results.pose_landmarks:
return "検出できません", frame
landmarks = results.pose_landmarks.landmark
# 肩・耳・腰の座標を取得
left_shoulder = [
landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x,
landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y
]
left_ear = [
landmarks[mp_pose.PoseLandmark.LEFT_EAR.value].x,
landmarks[mp_pose.PoseLandmark.LEFT_EAR.value].y
]
left_hip = [
landmarks[mp_pose.PoseLandmark.LEFT_HIP.value].x,
landmarks[mp_pose.PoseLandmark.LEFT_HIP.value].y
]
# 背骨の角度を計算(耳→肩→腰)
spine_angle = calculate_angle(left_ear, left_shoulder, left_hip)
# しきい値160度未満なら猫背と判定
if spine_angle < 160:
status = "⚠️ 姿勢が崩れています!"
color = (0, 0, 255) # 赤色で警告
else:
status = "✅ 良い姿勢です!"
color = (0, 255, 0) # 緑色でOK
# 骨格をフレームに描画
mp_drawing.draw_landmarks(frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
cv2.putText(frame, f'Angle: {int(spine_angle)}', (50, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, color, 2)
return status, frame
# メインループ
cap = cv2.VideoCapture(0) # Webカメラを開く
with mp_pose.Pose(min_detection_confidence=0.5,
min_tracking_confidence=0.5) as pose:
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
status, annotated_frame = detect_posture(frame, pose)
print(status)
cv2.imshow('姿勢モニター', annotated_frame)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
ポイントをまとめるとこんな感じです👇
- 📌 耳→肩→腰の角度を計算することで「頭が前に出ているか」を判定
- 📌 しきい値(ここでは160度)は自分の体型に合わせて調整OK
- 📌
mp_drawing.draw_landmarksで骨格を視覚化できる
🖥️ Electronと組み合わせてデスクトップ通知を出す
このPythonスクリプトをバックエンドにして、Electronがフロントエンドとして動く構成になります。PythonプロセスとElectronはWebSocketやHTTPで通信するのが一般的なパターンです。
つまり、こんな役割分担です。
- 🐍 Python(MediaPipe)… 姿勢の検出と判定
- ⚡ Electron… デスクトップ通知・UIの表示
まとめ
今回はMediaPipe Poseを使ってリアルタイムに姿勢を検出し、Electronと組み合わせてAI姿勢モニターを作る方法をご紹介しました。「AIは難しい」と感じていた方も、MediaPipeを使えば意外とシンプルにコンピュータビジョンアプリが作れることが伝わったら嬉しいです😊
しきい値の調整や通知音の追加など、カスタマイズの余地もたくさんあります。ぜひ自分好みの姿勢モニターに育てて、腰痛・肩こりを撃退してみてください!💪








