Face Tracking
2024. 6. 21. 11:25ㆍJetson
✅ 권한 부여
from servoserial import ServoSerial
servo = ServoSerial()
sudo chmod 777 /dev/ttyTHS1
# chmod -> change mode
# 리눅스의 권한을 주는 방식
# shdo chmod 777 /dev/ttyTHS1
# ____ _____ _____ read, write, execute
# user group other
# 111 101 001 -> sudo chmod 751
# 내 로봇 머리의 중앙값 찾기
# 1번 인덱스 좌우(600 ~ 3600), 2번 인덱스 상하(1300 ~ 4095)
servo.Servo_serial_double_control(1, 2400, 2, 2100)
# 내 로봇 머리의 중앙 값
center_x = 2400
center_y = 2100
✅ PID(비례 - 적분 - 미분)
- 카메라가 얼굴 탐지 영역의 중심점을 찾아가는데
- 어느정도로 움직여야할지 그 정도를 계산하는 라이브러리
# P (propotional : 비례)
# - 현재 물체와 원하는 위치 사이의 오차에 비례해서 움직임을 조절
# -> 오차가 크면 많이 움직이고 적으면 조금 움직임 -> 오차를 빠르게 줄여주는 역할
# I (integral : 적분)
# - 오랜 시간 동안 물체가 원하는 위치에 도달하지 못했을 때, 이전 오차들을 더한 후 누적해서 물체를 움직임
# -> 오차를 완전히 없애주고 정확한 위치로 가게 함
# D (derivative : 미분)
# - 물체가 급격히 위치를 바꿀 때 이 변화를 미리 감지하고 조절
# -> 로봇이 너무 빨리 이동하지 않게 함
# -> 세가지 요소를 결합해서 로봇 머리가 사람 얼굴을 찾아 부드럽고 정확하게 따라가도록 함
import PID
xservo_pid = PID.PositionalPID(1.9, 0.3, 0.35)
yservo_pid = PID.PositionalPID(1.5, 0.2, 0.3)
while 1:
frame = camera.value
cv2.resize(frame, (300, 300)) # 학습된 데이터의 이미지가 300*300 픽셀
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 흑백으로 변경
faces = face_cascade.detectMultiScale(gray) # 흑백 이미지 내에서 얼굴 검출
if len(faces) > 0 : # 만약 검출된게 있다면
(face_x, face_y, face_w, face_h) = faces[0] # 사진에 좌표 생성
# 직사각형 그리기!
cv2.rectangle(frame, (face_x, face_y), (face_x + face_w, face_y + face_h), (0, 0, 255), 4)
# 직사각형 생성 # (0, 0, 255) -> 빨강
# X축
xservo_pid.SystemOutput = face_x + face_w / 2 # 얼굴의 x축 중심점
xservo_pid.SetStepSignal(150) # 단계 신호 설정 -> 얼굴까지 얼마나 빠르게 움직여야 되는가! -> 150이면 빠른 정도
xservo_pid.SetInertiaTime(0.01, 0.006) # 관성시간 -> 변화에 대해서 얼마나 빠르게 대응!
target_x = int(center_x + xservo_pid.SystemOutput)
# Y축
yservo_pid.SystemOutput = face_y + face_h / 2 # 얼굴의 x축 중심점
yservo_pid.SetStepSignal(150) # 단계 신호 설정 -> 얼굴까지 얼마나 빠르게 움직여야 되는가! -> 150이면 빠른 정도
yservo_pid.SetInertiaTime(0.01, 0.006) # 관성시간 -> 변화에 대해서 얼마나 빠르게 대응!
target_y = int(center_y + yservo_pid.SystemOutput)
servo.Servo_serial_double_control(1, target_x, 2, target_y)
# 눈이 검출된다 -> 먼저 얼굴이 검출되어야 함
roi_region = gray[face_y : face_y + face_h, face_x : face_x + face_w]
# -> gray 전체 프레임에서 얼굴 영역만 슬라이싱
roi_color = frame[face_y : face_y + face_h, face_x : face_x + face_w]
# -> 눈을 표시할 수 있는 도형을 컬러 프레임에 찍기 위함! # 원본 -> frame
eyes = eye_cascade.detectMultiScale(roi_region) # 눈 검출
# 눈이 검출되었다면!
for eye_x, eye_y, eye_w, eye_h in eyes : # 눈이라고 인식된 모든 공간
cv2.rectangle(roi_color, (eye_x, eye_y), (eye_x + eye_w, eye_y + eye_h), (255, 0, 0), 2)
# (255, 0, 0) -> 파랑
detect_face.value = bgr8_to_jpeg(frame)
✅ 조이스틱 사용
sudo jstest /dev/input/js0
'Jetson' 카테고리의 다른 글
Wireless_Joystick (0) | 2024.06.24 |
---|---|
JoyStick (0) | 2024.06.21 |
Cat Detection (0) | 2024.06.20 |
FaceDetection (0) | 2024.06.20 |
openCV (0) | 2024.06.19 |