Загрузка данных


import cv2

def detect_faces_pro(image_path, scale=1.1, neighbors=10, min_size_ratio=0.05):
    # 1. Загрузка классификатора
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
    
    # 2. Чтение изображения
    img = cv2.imread(image_path)
    if img is None:
        return
    
    # 3. Предобработка
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # Улучшение контрастности (помогает убрать ложные срабатывания в тенях)
    gray = cv2.equalizeHist(gray)

    # 4. Вычисление минимального размера лица (например, не меньше 5% от ширины фото)
    # Это отсеет мелкий "мусор", который программа принимает за лица
    height, width = img.shape[:2]
    min_size = (int(width * min_size_ratio), int(height * min_size_ratio))

    # 5. Поиск лиц с повышенным параметром minNeighbors
    # Чем выше neighbors, тем меньше ложных срабатываний (обычно 5-10)
    faces = face_cascade.detectMultiScale(
        gray, 
        scaleFactor=scale, 
        minNeighbors=neighbors, 
        minSize=min_size
    )

    # 6. Рисуем рамки
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)

    print(f"Файл: {image_path}. Найдено лиц: {len(faces)}")
    
    cv2.imshow('Corrected Detection', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# Запуск тестов
# Если лишние лица всё еще есть — увеличь neighbors до 12 или 15
detect_faces_pro('one_face.jpg', scale=1.1, neighbors=8)
detect_faces_pro('multi_faces.jpg', scale=1.05, neighbors=10)