test1
class USBCameraStreamer:
def __init__(self):
self.camera = cv2.VideoCapture(0)
# 1. 얼굴 인식 모델 로딩
self.face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
self.is_running = False
# 2. 로봇 머리의 현재 각도 저장 (0~100, 중앙은 50)
self.head_pos = 50
def start_stream(self):
if not self.camera.isOpened():
self.camera.open(0)
self.is_running = True
return True, "USB Camera Started"
def stop_stream(self):
self.is_running = False
if self.camera.isOpened():
self.camera.release()
return True
def is_stream_active(self):
return self.is_running
def get_frame(self):
if self.is_running:
success, frame = self.camera.read()
if success:
# 성능을 위해 흑백 변환
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 얼굴 찾기
faces = self.face_cascade.detectMultiScale(gray, 1.1, 4)
for (x, y, w, h) in faces:
# 박스 그리기
cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 3. 얼굴의 중심점(x_center) 계산
x_center = x + (w / 2)
# 화면 너비(640) 기준, 중앙은 320입니다.
# 오차 범위(데드존)를 40픽셀로 둡니다 (280 ~ 360 사이면 움직이지 않음)
global arduino # 전역 변수 arduino 사용
if x_center < 280: # 얼굴이 왼쪽에 있음 -> 머리를 왼쪽으로 회전
if self.head_pos < 100:
self.head_pos += 1 # 각도 증가
arduino.send_command("G" + str(self.head_pos))
elif x_center > 360: # 얼굴이 오른쪽에 있음 -> 머리를 오른쪽으로 회전
if self.head_pos > 0:
self.head_pos -= 1 # 각도 감소
arduino.send_command("G" + str(self.head_pos))
ret, buffer = cv2.imencode('.jpg', frame)
return buffer.tobytes()
return None

redclip 님의 최근 댓글