자세 분석

wera4677·2025년 8월 24일

프로젝트

목록 보기
9/18
자세 분석에 관해서 생각을 해봤을때, 움직임 과 시선의 파악과 그에 맞는
기준이 필요할거같다. 구축 자체를 내가 한것을 아니지만 어떻게 진행이
되었는지 왜 이런선택을 했는지를 알고있어야하고, 기록을 해야한다고 
생각한다.

일단 간단한 기준을 세우기로 했다.
우리는 전문가가 아니기 때문에 가능한데 까지만 생각했다,

기준

  1. 신체 기준
  • 척추/허리: 허리가 구부정하거나 너무 젖혀지지 않았는가? → “허리를 곧게 펴면 자신감 있어 보여요.”

  • 어깨: 좌우 높이가 균형 잡혔는가? 긴장해서 올라가지 않았는가?

  • 머리/시선: 시선이 바닥·천장으로 치우치지 않고 정면을 향하는가?

  1. 표정 & 시선 관리
  • 시선 분산: 청중/면접관을 골고루 보았는가?

  • 눈 깜빡임/시선 회피: 불안한 신호로 해석될 수 있음

라이브러리

라이브러리역할사용 이유
cv2 (OpenCV)웹캠으로 영상 입력을 받고, 분석된 결과를 화면에 출력OpenCV는 이미지/영상 처리에 가장 널리 쓰이는 라이브러리로, 카메라 장치 제어와 실시간 영상 출력이 간단합니다. 면접 서비스 환경에서 웹캠 영상을 받아 실시간 자세 분석에 필수적이었습니다.
mediapipe사람의 관절(포즈)를 인식하는 모델 제공Google에서 제공하는 lightweight 딥러닝 기반 포즈 추정 라이브러리로, 33개 관절 좌표를 실시간으로 추출할 수 있습니다. OpenPose보다 가볍고, 웹캠 기반 서비스에 적합하여 선택했습니다.
math어깨 기울기 계산을 위한 삼각함수 사용Mediapipe로 얻은 관절 좌표(x, y)를 기반으로 기울기, 각도를 계산하기 위해 삼각함수가 필요합니다. Python 내장 math 라이브러리를 활용하면 별도 의존성 없이 안정적으로 구현 가능합니다.
time기울어진 상태가 몇 초 지속됐는지 측정자세 피드백은 단순 순간이 아니라 몇 초간 유지되는지가 중요합니다. time 모듈을 통해 시간 흐름을 체크하여, 일정 시간 이상 잘못된 자세가 유지될 경우만 피드백을 주도록 설계했습니다.
requestsDjango 서버로 count를 POST 방식 전송로컬에서 분석한 결과를 서버(DB)에 기록하기 위해 HTTP 통신이 필요했습니다. requests 라이브러리는 간단한 REST API 연동을 지원하여, 자세가 기울어진 횟수를 Django 서버에 POST로 전송하는 데 사용했습니다.

간결하게

OpenCV: 영상 입출력 (실시간 스트리밍)

Mediapipe: 관절 인식 (자세 데이터 추출)

Math: 기울기 계산 (수학적 기준)

Time: 지속 시간 측정 (피드백 조건)

Requests: 서버 연동 (결과 저장/기록)

테스트

import cv2
import mediapipe as mp
import math
import time
import requests

mp_pose = mp.solutions.pose
pose = mp_pose.Pose()

cap = cv2.VideoCapture(0)
bad_posture_count = 0
start_bad_time = None

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    results = pose.process(image_rgb)

    if results.pose_landmarks:
        l = results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_SHOULDER]
        r = results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_SHOULDER]

        dx = l.x - r.x
        dy = l.y - r.y
        angle = math.degrees(math.atan2(dy, dx))

        # 기준 각도 초과 → 일정 시간 이상 유지 시 count++
        if abs(angle) > 10:
            if start_bad_time is None:
                start_bad_time = time.time()
            elif time.time() - start_bad_time > 3:
                bad_posture_count += 1
                print(f"⚠ 자세 나쁨 count 증가 → {bad_posture_count}")
                start_bad_time = None
        else:
            start_bad_time = None

    cv2.imshow("Pose Check", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

# Django API로 count 전송
response = requests.post(
    "http://127.0.0.1:8000/api/posture/",
    json={"count": bad_posture_count}
)
print("✅ 서버 응답:", response.json())

결과

  • 고개를 기울이는 것에 대해서도 동일하게 카운트를 증가
  • 시선 돌아가는 것도 동일하게 카운트를 증가

profile
클라우드 꿈나무🌳

0개의 댓글