본 프로젝트는 실시간 영상 스트리밍, YOLOv8(face 전용) 얼굴 인식, UDP 통신을 통한 ESP32 서보 제어를 결합한 얼굴 추적 시스템입니다.
카메라 영상에서 얼굴을 검출하고, 얼굴 위치 및 크기에 따라 3개의 서보 모터(th1, th2, th3)를 실시간으로 제어합니다.
OpenCV (cv2): 영상 캡처 및 시각화ultralytics.YOLO: YOLOv8 얼굴 검출 모델socket: ESP32와 UDP 통신time: FPS 계산
GAIN_X: 좌우 회전 민감도GAIN_Y: 상하 회전 민감도GAIN_Z: 거리 조절 민감도
- 작은 오차에 대해 불필요한 서보 움직임을 방지
- 각 축별로 허용 오차 범위 설정
- 스마트폰의 "IPWebcam" 앱을 이용하여 실시간 영상 전송
- 스마트폰과 동일한 WI-FI에 연결된 PC에서 스마트폰의 IP 주소를 이용하여 영상 수신
- 카메라 버퍼 지연(latency) 최소화
- 항상 가장 최신 프레임만 처리
- 시작 시 ESP32로부터 초기 서보 각도 수신
- UDP 소켓을 사용하여 ESP32로 서보 각도 명령 전송
- 최신 프레임을 읽어와 처리
- 프레임이 없을 경우 skip
- 프레임에서 모든 얼굴 bounding box 탐색
- 크기가 가장 큰 얼굴을 주 타겟(face target) 으로 선택
- 너무 작은 얼굴은 노이즈로 간주하여 제외
- 화면 중심: (320, 240)
- 계산 항목:
- del_x : 좌우 오차
- del_y : 상하 오차
- size_error : 얼굴 크기 오차 (거리 추정)
-
좌우 회전 (th1)
- 얼굴 중심의 x 좌표 오차를 기준으로 제어
- 오차 크기에 따라 Gain 조절
- Deadzone 적용
-
상하 회전 (th3)
- 얼굴 중심의 y 좌표 오차를 기준으로 제어
- Deadzone 및 Gain 적용
- 서보 안전 범위 제한 (50~130) 적용
-
거리 조절 (th2)
- 얼굴 크기를 기준으로 거리 추정
- 얼굴이 작으면 전진, 크면 후진
- Deadzone 및 Gain 적용
- 모든 서보 각도를 0~180도 범위로 클램핑 -> 기계적 손상 방지
- UDP 메시지로 서보 각도 실시간 전송
th1:<angle>, th2:<angle>, th3:<angle>
- 얼굴 bounding box 표시
- 얼굴 중심 좌표 표시
- 화면 중심 기준점 표시
- 실시간 FPS 출력
- ESC 키 입력 시 루프 종료
- 카메라 스트림 해제
- OpenCV 윈도우 종료