Files

76 lines
2.6 KiB
Python

import cv2
import os
from datetime import datetime
from PIL import Image
import imagehash
# Инициализация классификатора для распознавания лиц
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# Запуск видеопотока с веб-камеры
video_capture = cv2.VideoCapture(0)
# Создание папки для сохранения лиц, если она не существует
if not os.path.exists('faces'):
os.makedirs('faces')
# Список хэшей сохраненных лиц
saved_faces_hashes = []
def calculate_image_hash(image):
return imagehash.average_hash(Image.fromarray(image))
def is_similar_hash(hash1, hash2, tolerance=5):
return hash1 - hash2 < tolerance
while True:
# Считывание кадра из видеопотока
ret, frame = video_capture.read()
# Преобразование изображения в оттенки серого
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Обнаружение лиц на кадре
faces = face_cascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30)
)
# Сохранение каждого нового обнаруженного лица
for i, (x, y, w, h) in enumerate(faces):
face_img = frame[y:y + h, x:x + w]
face_hash = calculate_image_hash(face_img)
# Проверка на схожесть с уже сохраненными лицами
similar_face = False
for saved_hash in saved_faces_hashes:
if is_similar_hash(face_hash, saved_hash):
similar_face = True
break
if not similar_face:
# Сохранение лица
face_file_path = os.path.join('faces', f'face_{datetime.now().strftime("%Y%m%d_%H%M%S")}_{i}.jpg')
cv2.imwrite(face_file_path, face_img)
saved_faces_hashes.append(face_hash)
# Рисование прямоугольника вокруг лица
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
# Отображение кадра с выделенными лицами
cv2.imshow('Video', frame)
# Прерывание цикла при нажатии клавиши 'q'
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Освобождение ресурсов
video_capture.release()
cv2.destroyAllWindows()