-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain_evg.py
149 lines (120 loc) · 6.07 KB
/
main_evg.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import os
import cv2
import pafy
import face_recognition
import numpy as np
import schedule
skip_frame = 3
video_capture = cv2.VideoCapture("rtsp://admin:[email protected]:554/ISAPI/Streaming/Channels/101")
# video_capture = cv2.VideoCapture("video/fo_test.avi")
# length = int(video_capture.get(cv2.CAP_PROP_FRAME_COUNT))
file_path = "kfe.npy"
# Размер начальной картинки 3840*2160
# Размер картинки для вывода на экран
desired_width = 1080
aspect_ratio = desired_width / 3840
desired_height = int(2160 * aspect_ratio)
dim = (desired_width, desired_height)
"""
Облабть обработки
# x1,y1_____________
# | |
# | |
# |_________________x2,y2
"""
x1 = 1600
x2 = 1750
y1 = 800
y2 = 1050
# x1 = 1250
# x2 = 2400
# y1 = 750
# y2 = 1800
face_locations = []
face_encodings = []
# Create arrays of known face encodings and their names
if os.path.isfile(file_path):
known_face_encodings = np.load("kfe.npy").tolist()
else:
known_face_encodings = []
print("Чтение данных")
print("Total in the database:")
print(len(known_face_encodings))
# Настройка расписания очистки списка известных лиц
def clear_array():
print("Clear known face")
known_face_encodings.clear()
os.remove("kfe.npy")
index = 0
schedule.every().day.at("00:00").do(clear_array)
index = 0
while True:
schedule.run_pending()
ret, frame = video_capture.read()
# ббрезаем изображение до ожлажти поипка
frame2 = frame[y1:y2, x1:x2]
if not ret:
break
if index == skip_frame:
rgb_frame = cv2.cvtColor(frame2, cv2.COLOR_BGR2RGB)
# Находим лица в области rgb_frame
# model="hog/cnn"
# Гистограмма направленных градиентов(HOG) работает быстро, вполне достаточно CPU, но распознает хуже и только фронтальные лица.
# Алгоритм на базе сверточных нейронных сетей(CNN) целесообразно использовать только на GPU, зато распознает гораздо лучше и во всех возможных позах.
# number_of_times_to_upsample - сколько раз увеличивать выборку изображения в поисках лиц. Чем больше число, тем меньше лица.
face_locations = face_recognition.face_locations(rgb_frame, number_of_times_to_upsample=2, model="cnn")
# model="small/large" модель поиска элементов лица (поиск опознавательных точек)
# small — углы глаз, нос, соотношение пропорций расстояний между глазами и носом
# large - также распознавание рта, овала лица и бровей
# num_jitters - сколько раз повторять выборку лица при расчете кодировки. Чем больше, тем точнее, но медленнее.
face_encodings = face_recognition.face_encodings(rgb_frame, face_locations, num_jitters=1, model="large")
# Loop through each face in this frame of video
for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
# See if the face is a match for the known face(s)
matches = face_recognition.compare_faces(known_face_encodings, face_encoding, tolerance=0.65)
face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
poisk = False
# проверка массивов на пустоту
if len(face_distances) > 0 and len(matches) > 0:
best_match_index = np.argmin(face_distances)
if matches[best_match_index]:
poisk = True
# poisk = False
# if True in matches:
# #print("Совпадение найдено")
# poisk = True
# first_match_index = matches.index(True)
# name = known_face_names[first_match_index]
if poisk:
#print("Присутстует в базе")
# Draw a label with a name below the face
cv2.rectangle(frame2, (left, bottom - 35), (right, bottom), (0, 255, 0), cv2.FILLED)
font = cv2.FONT_HERSHEY_DUPLEX
cv2.putText(frame2, "OK", (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)
# Draw a box around the face
cv2.rectangle(frame2, (left, top), (right, bottom), (0, 255, 0), 2)
else:
print("Добавить в базу нового")
known_face_encodings.append(face_encoding)
print(len(known_face_encodings))
# Draw a label with a name below the face
cv2.rectangle(frame2, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
font = cv2.FONT_HERSHEY_DUPLEX
cv2.putText(frame2, "NEW", (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)
# Draw a box around the face
cv2.rectangle(frame2, (left, top), (right, bottom), (0, 0, 255), 2)
index = 0
cv2.imshow('Input1', frame2)
index += 1
# Рисуем зеленый квадрат вокруг области поиска лиц
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 5)
# Display the resulting image
frame = cv2.resize(frame, dsize=dim, interpolation=cv2.INTER_AREA)
cv2.imshow('Input', frame)
# Hit 'q' on the keyboard to quit!
if cv2.waitKey(1) & 0xFF == ord('q'):
if (len(known_face_encodings) != 0):
np.save("kfe.npy", known_face_encodings)
break
video_capture.release()
cv2.destroyAllWindows()