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)