Post #59
33
Обновленная структура - сделанно легкую нейронную сеть для опредления емоций
FA @faris_fi

This post (sticker, poll or similar) has no web preview. Open in Telegram



This post (sticker, poll or similar) has no web preview. Open in Telegram
# Пример использования в основном цикле камеры
def camera_loop_with_light_control():
"""Пример интеграции управления светом в основной цикл камеры"""
global AUTO_LIGHT_ENABLED
esp32cam_url = "http://192.168.88.28/capture"
camera_active = True
# Включаем автосвет при старте
AUTO_LIGHT_ENABLED = True
try:
while camera_active:
# Получаем кадр с камеры ESP32
response = requests.get(esp32cam_url, timeout=2)
if response.status_code == 200:
img_array = np.array(bytearray(response.content), dtype=np.uint8)
frame = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
if frame is not None:
# Проверяем уровень освещенности
brightness = check_light_level(frame)
# Автоматическое управление светом
control_light(brightness)
# Добавляем информацию о освещении на экран
light_status = "ВКЛ" if brightness < LIGHT_THRESHOLD else "ВЫКЛ"
cv2.putText(frame, f"Яркость: {brightness:.1f}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)
cv2.putText(frame, f"Свет: {light_status}", (10, 60),
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)
cv2.putText(frame, f"Авто: {'ВКЛ' if AUTO_LIGHT_ENABLED else 'ВЫКЛ'}", (10, 90),
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)
# Отображаем кадр
cv2.imshow('Камера с автосветом', frame)
# Обработка клавиш
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
elif key == ord('a'): # Клавиша A для переключения авторежима
toggle_auto_light()
elif key == ord('l'): # Клавиша L для ручного включения
turn_on_light()
elif key == ord('d'): # Клавиша D для ручного выключения
turn_off_light()
time.sleep(0.1)
except Exception as e:
print(f"❌ Ошибка в цикле камеры: {e}")
finally:
# Гасим свет при выходе
turn_off_light()
cv2.destroyAllWindows()
# Голосовые команды для интеграции с ассистентом
def handle_light_commands(user_text):
"""Обработка голосовых команд для света"""
user_lower = user_text.lower()
if "включи свет" in user_lower or "включи фонарик" in user_lower:
success = turn_on_light()
return "Свет включен" if success else "Не удалось включить свет"
elif "выключи свет" in user_lower or "выключи фонарик" in user_lower:
success = turn_off_light()
return "Свет выключен" if success else "Не удалось выключить свет"
elif "автоматический свет" in user_lower or "авто свет" in user_lower:
status = toggle_auto_light()
return "Автоматический свет включен" if status else "Автоматический свет выключен"
return None
# Тестирование функции
if name == "main":
print("🔦 Тестирование функции фонарика")
# Тест ручного управления
print("1. Включаем свет...")
turn_on_light()
time.sleep(2)
print("2. Выключаем свет...")
turn_off_light()
time.sleep(1)
print("3. Включаем авторежим...")
toggle_auto_light()
# Запуск тестового цикла камеры
print("4. Запуск теста камеры с автосветом...")
print(" Клавиши: A-авто, L-свет вкл, D-свет выкл, Q-выход")
camera_loop_with_light_control()
This post (sticker, poll or similar) has no web preview. Open in Telegram
def detect_hand_skeleton(frame, hand_detector):
rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = hand_detector.process(rgb_frame)
if results.multi_hand_landmarks and results.multi_handedness:
hand_landmarks = results.multi_hand_landmarks[0]
handedness = results.multi_handedness[0].classification[0].label
return hand_landmarks, handedness
return None, None 3.
def get_hand_gesture(hand_landmarks, frame_width, frame_height):3.Определение направления указательного пальца
landmarks = []
for lm in hand_landmarks.landmark:
x = int(lm.x * frame_width)
y = int(lm.y * frame_height)
landmarks.append((x, y))
# Определение состояния пальцев (согнуты/разогнуты)
fingers_up = []
# Логика для большого пальца
thumb_tip = landmarks[4]
thumb_mcp = landmarks[2]
if thumb_tip[0] > thumb_mcp[0]: # Для правой руки
fingers_up.append(1)
else:
fingers_up.append(0)
# Остальные пальцы
finger_tips = [8, 12, 16, 20] # Указательный, средний, безымянный, мизинец
finger_pips = [6, 10, 14, 18] # Суставы
for tip, pip in zip(finger_tips, finger_pips):
if landmarks[tip][1] < landmarks[pip][1]: # Кончик выше сустава
fingers_up.append(1)
else:
fingers_up.append(0)
total_fingers = sum(fingers_up)
if total_fingers == 0:
return "fist", fingers_up
elif total_fingers == 1 and fingers_up[1] == 1:
return "one_finger", fingers_up
elif total_fingers >= 2:
return "open_hand", fingers_up
else:
return "unknown", fingers_up
def get_finger_direction(hand_landmarks, frame_width, frame_height):
landmarks = []
for lm in hand_landmarks.landmark:
x = int(lm.x * frame_width)
y = int(lm.y * frame_height)
landmarks.append((x, y))
index_mcp = landmarks[5] # Сустав указательного пальца
index_tip = landmarks[8] # Кончик указательного пальца
dx = index_tip[0] - index_mcp[0]
dy = index_tip[1] - index_mcp[1]
if dx == 0:
angle = 90
else:
angle = np.degrees(np.arctan2(dy, dx))
x_center = index_tip[0] / frame_width
if x_center < 0.4:
return "left", angle
elif x_center > 0.6:
return "right", angle
else:
return "center", angle 5.
def draw_hand_skeleton(frame, hand_landmarks, gesture, direction):
mp_drawing.draw_landmarks(
frame,
hand_landmarks,
mp_hands.HAND_CONNECTIONS,
mp_drawing_styles.get_default_hand_landmarks_style(),
mp_drawing_styles.get_default_hand_connections_style()
)
cv2.putText(frame, f"Жест: {gesture}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
cv2.putText(frame, f"Направление: {direction}", (10, 60),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
return frame Пример использования из кода: if hand_landmarks:
# Определение жеста
gesture, fingers_up = get_hand_gesture(hand_landmarks, frame.shape[1], frame.shape[0])
# Определение направления
direction, angle = get_finger_direction(hand_landmarks, frame.shape[1], frame.shape[0])
# Визуализация
frame = draw_hand_skeleton(frame, hand_landmarks, gesture, direction)
# Управление роботом на основе жестов
if gesture == "fist":
send_command_to_esp("stop")
elif gesture == "one_finger" and direction == "center":
send_command_to_esp("forward")
elif gesture == "one_finger" and direction == "left":
send_command_to_esp("left")
elif gesture == "one_finger" and direction == "right":
send_command_to_esp("right")
Функция скелета руки представляет собой комплексную систему компьютерного зрения для трекинга и анализа кисти человека в реальном времени. Реализация основана на использовании библиотеки MediaPipe, которая обеспечивает обнаружение и локализацию 21 ключевой точки-ландмарка на каждой руке.
Процесс начинается с инициализации детектора рук с заданными параметрами уверенности обнаружения и отслеживания. Для каждого видеокадра выполняется преобразование цветового пространства из BGR в RGB, после чего детектор обрабатывает изображение и возвращает координаты ландмарков в нормализованном виде. Эти координаты преобразуются в пиксельные значения относительно размеров кадра.
На следующем этапе выполняется классификация жестов на основе анализа относительного положения кончиков пальцев и соответствующих суставов. Алгоритм определяет количество разогнутых пальцев путем сравнения вертикальных координат их кончиков и средних фаланг. Это позволяет идентифицировать три основных жестовых состояния: кулак, один поднятый палец и открытая ладонь.
Дополнительно реализована функция определения пространственной ориентации указательного пальца. Через расчет угла наклона и позиции кончика пальца относительно центра кадра определяется направление жеста. Полученные данные жеста и направления используются для управления внешними устройствами.
Визуализация включает отрисовку скелета руки путем соединения ландмарков линиями согласно анатомическим связям, а также наложение текстовой информации о распознанном жесте и направлении. Система демонстрирует устойчивую работу при различных условиях освещенности и ракурсах.