import math
import cv2
import dlib
def landmarks_point(grayFrame,face):
landmarks = predictor(grayFrame, face)
# left_eys
x_r_36 = landmarks.part(36).x
y_r_36 = landmarks.part(36).y
x_r_39 = landmarks.part(39).x
y_r_39 = landmarks.part(39).y
X_r = (x_r_39 + x_r_36) / 2
Y_r = (y_r_39 + y_r_36) / 2
# rigth_eys
x_l_42 = landmarks.part(42).x
y_l_42 = landmarks.part(42).y
x_l_45 = landmarks.part(45).x
y_l_45 = landmarks.part(45).y
X_l = (x_l_42 + x_l_45) / 2
Y_l = (y_l_42 + y_l_45) / 2
# nachalo_psk
X_o = (X_l + X_r) / 2
Y_o = (Y_l + Y_r) / 2
# Расстояния между средними точками глаз вдоль осей Х и Y:
DX = math.fabs(X_r - X_l)
DY = math.fabs(Y_r - Y_l)
# Действительное расстояние L между средними точками глаз (по теореме Пифагора):
L = pow((DX ** 2) + (DY ** 2), 0.5)
# Тригонометрические функции угла поворота ПСК
sin_AL = DY / L
L=math.asin(sin_AL)
return X_o,Y_o,L
# Для детектирования лиц используем каскады Хаара
Path = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(Path)
# Запуск видео потока
cap = cv2.VideoCapture(0)
# Модель для поиска ключевых точек
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
while True:
# Получение изображения из видео потока
ret, frame = cap.read()
#Мы это сделали, т.к. если лица не будет , не сможем получить roi_gray, будет ошибка
if ret == 0:
break
# Конвертирование изображения в черно-белое
grayFrame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Обнаружение лиц и построение прямоугольного контура
faces =faceCascade.detectMultiScale(grayFrame, minNeighbors = 10)
for x, y, width, height in faces:
cv2.rectangle(frame, (x, y), (x + width, y + height), color=(255, 255, 255), thickness=1)
face=dlib.rectangle(x, y , x+width, y+height)
cv2.imshow("FACE IN IMAGE", frame)
if cv2.waitKey(10) & 0xFF == ord('e'): # <<<<< 0xFF
break
#Если вызовем, а лица не будет == > бред, смысла вызывать нет
if len(faces)!=0:
X_new_psk,Y_new_psk, L_in_grad=landmarks_point(grayFrame, face)
roi_gray = frame[y:(y + height), x:(x + width)]
rotation_matrix =cv2.getRotationMatrix2D(( X_new_psk,Y_new_psk),L_in_grad, 1)
print(rotation_matrix)
anfas=cv2.warpAffine(roi_gray,rotation_matrix,(400,400))
cv2.imshow('ANFAS',anfas)
cv2.waitKey()
cap.release()
cv2.destroyAllWindows()