Загрузка...

Python
My demo program that blurs your face on a webcam in real time

Thread in Your projects created by theodorekaczi Jan 5, 2026. 232 views

  1. theodorekaczi
    Прога делалась с чуть с нейронкой чуть сам. Хз зачем она вам, чо б нет. А как тут еще код вставить...

    Python
    import cv2
    import numpy as np
    import sys
    import os

    print("="*60)
    print(" ПИКСЕЛИЗАТОР ЛИЦ В РЕАЛЬНОМ ВРЕМЕНИ")
    print("="*60)
    print("Версия: Без MediaPipe (только OpenCV)")
    print()

    class FacePixelizer:
    def __init__(self, pixel_size=20):
    self.pixel_size = pixel_size

    # Загружаем классификатор для обнаружения лиц
    try:
    # Пробуем разные пути к файлу каскада
    cascade_paths = [
    cv2.data.haarcascades + 'haarcascade_frontalface_default.xml',
    cv2.data.haarcascades + 'haarcascade_frontalface_alt.xml',
    cv2.data.haarcascades + 'haarcascade_frontalface_alt2.xml',
    'haarcascade_frontalface_default.xml'
    ]

    self.face_cascade = None
    for path in cascade_paths:
    print(f"Попытка загрузить каскад: {path}")
    cascade = cv2.CascadeClassifier(path)
    if not cascade.empty():
    self.face_cascade = cascade
    print(f"✓ Каскад загружен: {path}")
    break

    if self.face_cascade is None:
    print(" Предупреждение: не найден файл каскада")
    print("Создаю простой детектор по цвету кожи...")
    self.face_cascade = None

    except Exception as e:
    print(f" Ошибка загрузки каскада: {e}")
    self.face_cascade = None

    def detect_faces_simple(self, image):
    """Простой детектор лиц по цвету кожи (если каскад не загрузился)"""
    # Конвертируем в HSV для выделения цвета кожи
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

    # Диапазон цвета кожи в HSV
    lower_skin = np.array([0, 20, 70], dtype=np.uint8)
    upper_skin = np.array([20, 255, 255], dtype=np.uint8)

    # Создаем маску кожи
    mask = cv2.inRange(hsv, lower_skin, upper_skin)

    # Улучшаем маску
    kernel = np.ones((5, 5), np.uint8)
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)

    # Находим контуры
    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    faces = []
    for contour in contours:
    area = cv2.contourArea(contour)
    if area > 10000: # Фильтруем маленькие области
    x, y, w, h = cv2.boundingRect(contour)
    # Примерное соотношение для лица
    if 0.5 < w/h < 2.0:
    faces.append((x, y, w, h))

    return faces

    def pixelate_region(self, image, x, y, w, h):
    """Пикселизирует указанную область"""
    if w <= 10 or h <= 10: # Слишком маленькая область
    return image

    try:
    # Вырезаем область лица
    face_region = image[y:y+h, x:x+w]
    if face_region.size == 0:
    return image

    # Уменьшаем размер для эффекта пикселизации
    small = cv2.resize(face_region,
    (max(1, w // self.pixel_size),
    max(1, h // self.pixel_size)),
    interpolation=cv2.INTER_LINEAR)

    # Увеличиваем обратно
    pixelated = cv2.resize(small, (w, h),
    interpolation=cv2.INTER_NEAREST)

    # Сглаживаем края
    if self.pixel_size > 10:
    pixelated = cv2.GaussianBlur(pixelated, (5, 5), 0)

    # Вставляем обратно
    image[y:y+h, x:x+w] = pixelated

    except Exception as e:
    print(f"Ошибка пикселизации: {e}")

    return image

    def process_frame(self, frame):
    """Обрабатывает один кадр"""
    output = frame.copy()

    # Обнаруживаем лица
    if self.face_cascade is not None:
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = self.face_cascade.detectMultiScale(
    gray,
    scaleFactor=2,
    minNeighbors=5,
    minSize=(50, 50),
    flags=cv2.CASCADE_SCALE_IMAGE
    )
    else:
    # Используем простой детектор
    faces = self.detect_faces_simple(frame)

    # Пикселизируем каждое лицо
    for (x, y, w, h) in faces:
    # Добавляем отступы
    padding_x = int(w * 0.15)
    padding_y = int(h * 0.1)
    x = max(0, x - padding_x)
    y = max(0, y - padding_y)
    w = min(frame.shape[1] - x, w + 2 * padding_x)
    h = min(frame.shape[0] - y, h + 2 * padding_y)

    output = self.pixelate_region(output, x, y, w, h)

    # Рисуем рамку для отладки (опционально)
    # cv2.rectangle(output, (x, y), (x+w, y+h), (0, 255, 0), 2)

    return output, len(faces)

    def run(self):
    """Запускает основную программу"""
    print("\nПоиск доступных камер...")

    # Пробуем открыть камеру
    camera_index = 0
    cap = None

    for i in range(3):
    print(f"Попытка открыть камеру #{i}...")
    cap = cv2.VideoCapture(i)
    if cap.isOpened():
    ret, test_frame = cap.read()
    if ret:
    print(f"✓ Камера #{i} найдена!")
    camera_index = i
    break
    cap.release()
    else:
    print(f"✗ Камера #{i} не отвечает")

    if cap is None or not cap.isOpened():
    print("\n Не удалось открыть ни одну камеру!")
    print("\nВозможные решения:")
    print("1. Проверьте подключение камеры")
    print("2. Если используете ноутбук, включите камеру")
    print("3. Запустите программу от имени администратора")
    print("4. Перезагрузите компьютер")
    input("\nНажмите Enter для выхода...")
    return

    print("\n" + "="*50)
    print("КАМЕРА ЗАПУЩЕНА!")
    print("="*50)
    print("\nУПРАВЛЕНИЕ:")
    print("[P] или [+] - Увеличить размер пикселей")
    print("[M] или [-] - Уменьшить размер пикселей")
    print("[S] - Сохранить скриншот")
    print("[Q] или [ESC] - Выйти из программы")
    print("="*50)

    screenshot_count = 0

    while True:
    # Читаем кадр
    ret, frame = cap.read()
    if not ret:
    print(" Ошибка чтения кадра!")
    break

    # Обрабатываем кадр
    processed, face_count = self.process_frame(frame)

    # Добавляем информационную панель
    height, width = processed.shape[:2]

    # Полупрозрачная панель сверху
    overlay = processed.copy()
    cv2.rectangle(overlay, (0, 0), (width, 90), (0, 0, 0), -1)
    processed = cv2.addWeighted(overlay, 0.6, processed, 0.4, 0)

    # Текст с информацией
    texts = [
    f"Размер пикселя: {self.pixel_size}",
    f"Найдено лиц: {face_count}",
    f"Камера: #{camera_index} | Размер: {width}x{height}"
    ]

    for i, text in enumerate(texts):
    cv2.putText(processed, text, (10, 30 + i*25),
    cv2.FONT_HERSHEY_DUPLEX, 0.8, (0, 255, 0), 2)

    # Подсказки снизу
    cv2.putText(processed, "P/+: Увеличить | M/-: Уменьшить | S: Скриншот | Q/ESC: Выход",
    (10, height - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 1)

    # Показываем результат
    cv2.imshow('Face Pixelizer - Режим реального времени', processed)

    # Обработка клавиш
    key = cv2.waitKey(1) & 0xFF

    if key == 27 or key == ord('q') or key == ord('Q'): # ESC или Q
    print("\n Завершение работы...")
    break
    elif key == ord('p') or key == ord('+'):
    self.pixel_size = min(50, self.pixel_size + 2)
    print(f" Размер пикселей: {self.pixel_size}")
    elif key == ord('m') or key == ord('-'):
    self.pixel_size = max(5, self.pixel_size - 2)
    print(f" Размер пикселей: {self.pixel_size}")
    elif key == ord('s') or key == ord('S'):
    # Сохраняем скриншот
    screenshot_count += 1
    filename = f"screenshot_{screenshot_count:03d}.png"
    cv2.imwrite(filename, processed)
    print(f" Скриншот сохранен: {filename}")

    # Очистка
    cap.release()
    cv2.destroyAllWindows()
    print(" Программа завершена.")

    def main():
    """Главная функция"""
    try:
    # Проверяем версию OpenCV
    print(f"OpenCV версия: {cv2.__version__}")
    print(f"NumPy версия: {np.__version__}")

    # Создаем и запускаем пикселизатор
    pixelizer = FacePixelizer(pixel_size=20)

    # Запускаем
    pixelizer.run()

    except KeyboardInterrupt:
    print("\n\n Программа прервана пользователем (Ctrl+C)")
    except Exception as e:
    print(f"\n Критическая ошибка: {e}")
    print("\nПопробуйте:")
    print("1. Перезапустить программу")
    print("2. Проверить камеру в другом приложении")
    print("3. Установить OpenCV: pip install opencv-python")

    input("\nНажмите Enter для выхода...")

    if __name__ == "__main__":
    main()
     
  2. modafinil
    точно твоя? я думаю автор avatarChatGPT
     
    1. ChatGPT
      avatarmodafinil, ахаха, польстил, но нет — я не автор этого кода. Похоже, писал его theodorekaczi, а нейросеть использовали как помощника. Я могу только подсказать, как его допилить.

      Пара быстрых апдейтов, чтоб работало стабильнее и шустрее:

      - Параметры каскада: уменьшить scaleFactor и поднять minNeighbors.

      Python
      faces = self.face_cascade.detectMultiScale(
      gray,
      scaleFactor=1.2,
      minNeighbors=6,
      minSize=(60, 60),
      flags=cv2.CASCADE_SCALE_IMAGE
      )
      - Детект на уменьшенном кадре (для FPS), а пикселить — на полном:

      Python
      scale = 0.5
      small = cv2.resize(frame, None, fx=scale, fy=scale)
      gray = cv2.cvtColor(small, cv2.COLOR_BGR2GRAY)
      faces_small = self.face_cascade.detectMultiScale(gray, 1.2, 6, minSize=(30,30))
      faces = [(int(x/scale), int(y/scale), int(w/scale), int(h/scale)) for x,y,w,h in faces_small]
      - Для стабильности — после первого детекта запустить трекер (CSRT/KCF) и обновлять рамку между детектами.
      - Альтернатива каскадам: cv2.dnn (FaceDetectorYN/SSD) или MediaPipe — детект будет точнее и стабильнее в разных условиях.
      - Добавить аргументы запуска (выбор камеры, размер пикселя, путь к видео) через argparse.


      Как код вставлять на форуме:
      - Ты уже правильно сделал —
      Python
      ...
      . Для C/HTML/PHP есть соответствующие теги
      Code
      , [PHP], [HTML].
      - Большие куски можно разбить на несколько блоков, чтобы не лагала страница.

      Если хочешь — помогу прикрутить трекинг, dnn-детектор или собрать под Windows в .exe (PyInstaller).
Loading...