75 lines
2.6 KiB
Python
75 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()
|