USER
Опиши этот код для системы учёта посещаемости студентов с помощью распознавания лиц:
import pickle
import face_recognition
import cv2
import os
import numpy as np
import cvzone
from EncodeGenerator import encodeListKnownWithIds, studentIds
cap = cv2.VideoCapture(1)
cap.set(3,640)
cap.set(4,480)
imgBackground = cv2.imread('C:\\Users\\user\\PycharmProjects\\PythonProject\\Resources\\background.png')
#Загрузка 4 изображений из modes в лист
folderModePath = 'C:\\Users\\user\\PycharmProjects\\PythonProject\\Resources\\Modes'
modePathList = os.listdir(folderModePath)
imgModeList = []
for path in modePathList:
imgModeList.append(cv2.imread(os.path.join(folderModePath, path)))
#print(len(imgModeList))
#Load the encoding file
print("Loading Encode File ...")
file = open('EncodeFile.p','rb')
encodeListKnownWithIds = pickle.load(file)
file.close()
encodeListKnown, studentIds = encodeListKnownWithIds
#print(studentIds)
print("Encode File Loaded")
while True:
success, img = cap.read()
imgS = cv2.resize(img, (0, 0), None, 0.25, 0.25)
imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)
faceCurFrame = face_recognition.face_locations(imgS)
encodeCurFrame = face_recognition.face_encodings(imgS, faceCurFrame)
imgBackground[162:162+480,55:55+640] = img
imgBackground[44:44 + 633, 808:808 + 414] = imgModeList[1]
for encodeFace, faceLoc in zip(encodeCurFrame, faceCurFrame):
matches = face_recognition.compare_faces(encodeListKnown, encodeFace)
faceDis = face_recognition.face_distance(encodeListKnown, encodeFace)
#print("matches", matches)
#print("faceDis", faceDis)
matchIndex = np.argmin(faceDis)
# print("Match Index", matchIndex)
if matches[matchIndex]:
print("Лицо обнаружено")
print(studentIds[matchIndex])
y1, x2, y2, x1 = faceLoc
y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4
bbox = 55 + x1, 162 + y1, x2 - x1, y2 - y1
imgBackground = cvzone.cornerRect(imgBackground, bbox, rt=0)
#cv2.imshow("Webcam", img)
cv2.imshow("Face Attendance", imgBackground)
cv2.waitKey(1)ASSISTANT
Данный код реализует систему учёта посещаемости студентов с использованием распознавания лиц. Ниже приведено описание работы и логики кода:
---
### 1. **Импорт библиотек и модулей**
```python
import pickle
import face_recognition
import cv2
import os
import numpy as np
import cvzone
```
- **`pickle`**: Используется для загрузки и сохранения списка уже известных "закодированных" лиц (их векторных представлений).
- **`face_recognition`**: Библиотека для распознавания и кодирования лиц.
- **`cv2`**: OpenCV. Используется для работы с изображением (видеопоток, отображение данных, преобразование цвета и т.д.).
- **`os`**: Модуль для работы с файловой системой (загрузка файлов, навигация по папкам).
- **`numpy`**: Для работы с массивами данных.
- **`cvzone`**: Библиотека для удобной визуализации графики (например, отрисовка прямоугольников на изображениях).
---
### 2. **Настройка исходных данных**
#### Инициализация камеры
```python
cap = cv2.VideoCapture(1)
cap.set(3,640) # Установка ширины кадра
cap.set(4,480) # Установка высоты кадра
```
- Камера захватывает видеопоток. Индекс камеры `1` указывает, что используется вторая подключённая камера (если бы был `0`, использовалась бы первая камера).
- Разрешение кадра установлено на 640x480.
#### Фоновое изображение
```python
imgBackground = cv2.imread('C:\\Users\\user\\PycharmProjects\\PythonProject\\Resources\\background.png')
```
Загружается статическое фоновое изображение (`background.png`), на которое будет накладываться видео с камеры и другие визуальные элементы.
#### Загрузка интерфейсных режимов
```python
folderModePath = 'C:\\Users\\user\\PycharmProjects\\PythonProject\\Resources\\Modes'
modePathList = os.listdir(folderModePath)
imgModeList = []
for path in modePathList:
imgModeList.append(cv2.imread(os.path.join(folderModePath, path)))
```
- `folderModePath` содержит дополнительные изображения из папки "Modes". В данном случае их могут использовать для отображения различных интерфейсных элементов.
- Все изображения в папке загружаются в список `imgModeList`.
---
### 3. **Загрузка закодированных данных (Encoding File)**
```python
file = open('EncodeFile.p','rb')
encodeListKnownWithIds = pickle.load(file)
file.close()
encodeListKnown, studentIds = encodeListKnownWithIds
```
- **`EncodeFile.p`** — это файл, содержащий данные о предварительно закодированных лицах из базы. Кодировка лица представляет собой числовой вектор, определяющий уникальные характеристики человека.
- Сохраняются две переменные:
- `encodeListKnown` — список секторов (векторов), закодированных для всех известных лиц.
- `studentIds` — список идентификаторов студентов, соответствующий каждому лицу в `encodeListKnown`.
---
### 4. **Основной цикл работы программы**
Программа запускает бесконечный цикл, внутри которого производится захват изображений с камеры, анализ лиц, а также отрисовка интерфейса.
#### Захват и преобразование кадров
```python
success, img = cap.read()
imgS = cv2.resize(img, (0, 0), None, 0.25, 0.25)
imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)
```
- С помощью камеры захватывается изображение (кадр видеопотока `img`).
- Для увеличения производительности изображение уменьшается до четверти оригинального размера.
- Каждый кадр преобразуется в цветовой код RGB (необходим для работы библиотеки `face_recognition`).
#### Обнаружение лиц на кадре
```python
faceCurFrame = face_recognition.face_locations(imgS)
encodeCurFrame = face_recognition.face_encodings(imgS, faceCurFrame)
```
- **`face_recognition.face_locations`** — определяет местоположение лиц на уменьшенном изображении.
- **`face_recognition.face_encodings`** — создает векторное представление найденных на изображении лиц (их кодировку).
#### Вставка отображения камеры на фон
```python
imgBackground[162:162+480,55:55+640] = img
imgBackground[44:44 + 633, 808:808 + 414] = imgModeList[1]
```
- Видео с камеры (`img`) вставляется в определенную область фонового изображения (`imgBackground`).
- Аналогично, добавляются элементы интерфейса из `imgModeList`.
---
### 5. **Распознавание лиц**
Внутри цикла проводится сравнение текущих лиц с известными лицами:
#### Сравнение лиц
```python
for encodeFace, faceLoc in zip(encodeCurFrame, faceCurFrame):
matches = face_recognition.compare_faces(encodeListKnown, encodeFace)
faceDis = face_recognition.face_distance(encodeListKnown, encodeFace)
```
- Текущее закодированное лицо (`encodeFace`) сравнивается со всеми известными лицами из базы (`encodeListKnown`).
- Результат сохраняется в:
- **`matches`**: логический список (True/False), где `True` указывает на совпадение.
- **`faceDis`**: список расстояний между вектором текущего лица и известными лицами (меньшее расстояние означает большее сходство).
#### Определение ближайшего совпадения
```python
matchIndex = np.argmin(faceDis)
if matches[matchIndex]:
print("Лицо обнаружено")
print(studentIds[matchIndex])
```
- Используется индекс лица с самым маленьким расстоянием (`np.argmin(faceDis)`).
- Если совпадение найдено (`matches[matchIndex] == True`), программа:
- Выводит сообщение "Лицо обнаружено".
- Отображает идентификатор студента (`studentIds[matchIndex]`), связанный с найденным лицом.
#### Визуальная маркировка обнаруженного лица
```python
y1, x2, y2, x1 = faceLoc
y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4
bbox = 55 + x1, 162 + y1, x2 - x1, y2 - y1
imgBackground = cvzone.cornerRect(imgBackground, bbox, rt=0)
```
- Координаты лица, найденного на уменьшенном кадре, масштабируются обратно к оригинальному размеру.
- На изображении рисуется рамка (`bbox`) вокруг обнаруженного лица с использованием библиотеки `cvzone`.
---
### 6. **Вывод изображения**
```python
cv2.imshow("Face Attendance", imgBackground)
cv2.waitKey(1)
```
- Финальная обработка изображения отображается в окне "Face Attendance".
- `cv2.waitKey(1)` обрабатывает события окна и поддерживает обновление изображения.
---
### Итоговая функциональность
1. Загружает базу зарегистрированных лиц (кодировки и идентификаторы студентов).
2. Запускает видеопоток через камеру.
3. Определяет лица в кадре, сравнивает их с данными из базы и идентифицирует студента.
4. Отображает интерфейс с видео, визуализацией обнаружения лица и наличием дополнительных режимов.
5. Распознанный студент выводится в консоль (`studentIds[matchIndex]`).
Это базовая реализация для системы учета посещаемости через распознавание лиц с интерфейсом на основе OpenCV.