자세 분석에 관해서 생각을 해봤을때, 움직임 과 시선의 파악과 그에 맞는 기준이 필요할거같다. 구축 자체를 내가 한것을 아니지만 어떻게 진행이 되었는지 왜 이런선택을 했는지를 알고있어야하고, 기록을 해야한다고 생각한다.
일단 간단한 기준을 세우기로 했다.
우리는 전문가가 아니기 때문에 가능한데 까지만 생각했다,
척추/허리: 허리가 구부정하거나 너무 젖혀지지 않았는가? → “허리를 곧게 펴면 자신감 있어 보여요.”
어깨: 좌우 높이가 균형 잡혔는가? 긴장해서 올라가지 않았는가?
머리/시선: 시선이 바닥·천장으로 치우치지 않고 정면을 향하는가?
시선 분산: 청중/면접관을 골고루 보았는가?
눈 깜빡임/시선 회피: 불안한 신호로 해석될 수 있음
| 라이브러리 | 역할 | 사용 이유 |
|---|---|---|
| cv2 (OpenCV) | 웹캠으로 영상 입력을 받고, 분석된 결과를 화면에 출력 | OpenCV는 이미지/영상 처리에 가장 널리 쓰이는 라이브러리로, 카메라 장치 제어와 실시간 영상 출력이 간단합니다. 면접 서비스 환경에서 웹캠 영상을 받아 실시간 자세 분석에 필수적이었습니다. |
| mediapipe | 사람의 관절(포즈)를 인식하는 모델 제공 | Google에서 제공하는 lightweight 딥러닝 기반 포즈 추정 라이브러리로, 33개 관절 좌표를 실시간으로 추출할 수 있습니다. OpenPose보다 가볍고, 웹캠 기반 서비스에 적합하여 선택했습니다. |
| math | 어깨 기울기 계산을 위한 삼각함수 사용 | Mediapipe로 얻은 관절 좌표(x, y)를 기반으로 기울기, 각도를 계산하기 위해 삼각함수가 필요합니다. Python 내장 math 라이브러리를 활용하면 별도 의존성 없이 안정적으로 구현 가능합니다. |
| time | 기울어진 상태가 몇 초 지속됐는지 측정 | 자세 피드백은 단순 순간이 아니라 몇 초간 유지되는지가 중요합니다. time 모듈을 통해 시간 흐름을 체크하여, 일정 시간 이상 잘못된 자세가 유지될 경우만 피드백을 주도록 설계했습니다. |
| requests | Django 서버로 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())




