Пишу код, который распознаёт лицо, ищет совпадение в базе, если совпадения нет, то запрашивает имя лица и сохраняет в базу.
Возникает ошибка при сравнении нового лица и лица из базы:
line 41, in <module>
distance = np.linalg.norm(face_encoding - saved_face)
~~~~~~~~~~~~~~^~~~~~~~~~~~
numpy.core._exceptions._UFuncNoLoopError: ufunc 'subtract' did not contain a loop with signature matching types (dtype('uint8'), dtype('S10000')) -> None
Участок кода с ошибкой:
# Извлечение моделей лиц из базы данных
cursor.execute('SELECT face_encoding FROM faces')
saved_faces = cursor.fetchall()
# Преобразование списка кортежей в список массивов NumPy
saved_faces = [face[0] for face in saved_faces]
# Извлечение модели лица из изображения
face_encoding = face_image.flatten()
# Сравнение моделей лиц
for saved_face in saved_faces:
# Вычисление евклидова расстояния между моделями лиц
distance = np.linalg.norm(face_encoding - saved_face)
Я уже пробовал изменить
saved_face с
dtype('S10000') на
dtype('uint8') прописывая следующую строку:
saved_face = saved_face.astype(np.uint8)
И тогда в новой строке появилась другая ошибка:
saved_face = saved_face.astype(np.uint8)
^^^^^^^^^^^^^^^^^
AttributeError: 'bytes' object has no attribute 'astype'
Как решить эту ошибку?
Код я вообще не знаю, пишу код по различным статьям.
Весь кодimport cv2
import tkinter as tk
import PIL
from PIL import Image, ImageTk
import sqlite3
import numpy as np
conn = sqlite3.connect('faces.db')
cursor = conn.cursor()
# Загрузить изображение
images = cv2.imread('img/_DSC0362+.jpg')
# Загрузить каскад Хаара для распознавания лиц
face_cascade = cv2.CascadeClassifier('venv/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml')
# Преобразовать изображение в серый цвет, так как каскад Хаара работает лучше с такими изображениями
gray = cv2.cvtColor(images, cv2.COLOR_BGR2GRAY)
# Найти лица на изображении с помощью каскада Хаара
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
# Извлечь изображение лица из изображения
for (x, y, w, h) in faces:
face_image = gray[y:y + h, x:x + w]
# Извлечение моделей лиц из базы данных
cursor.execute('SELECT face_encoding FROM faces')
saved_faces = cursor.fetchall()
# Преобразование списка кортежей в список массивов NumPy
saved_faces = [face[0] for face in saved_faces]
# Извлечение модели лица из изображения
face_encoding = face_image.flatten()
# Сравнение моделей лиц
for saved_face in saved_faces:
saved_face = saved_face.astype(np.uint8)
# Вычисление евклидова расстояния между моделями лиц
distance = np.linalg.norm(face_encoding - saved_face)
# Установка порога совпадения
threshold = 0.6
# Проверка, существует ли совпадение
if distance < threshold:
print('Лицо распознано верно')
break
else:
# Изменить размер изображения лица на 100x100 пикселей
face_image = cv2.resize(face_image, (100, 100))
print('Лицо не распознано')
# Создание окна
window = tk.Tk()
window.title('Неизвестное лицо')
# Создание картинки
image = Image.fromarray(face_image)
image = ImageTk.PhotoImage(image)
# Создание метки с картинкой
label = tk.Label(window, image=image)
label.pack()
# Создание строки ввода имени
entry = tk.Entry(window)
entry.pack()
# Ожидание ввода имени человека
name = entry.get()
# Сохранение имени и модели лица в базе данных
def save_name():
cursor.execute("INSERT INTO faces (name, face_encoding) VALUES (?, ?)", (name, face_encoding))
conn.commit()
# Создание кнопки сохранения имени
button = tk.Button(window, text='Сохранить', command=save_name)
button.pack()
# Запуск окна
window.mainloop()