Для первой части вы можете использовать cv2.matchTemplate
, чтобы найти область глаза на лице, а затем, в зависимости от желаемого размера, вы можете увеличить ее. Вы можете прочитать больше об этом здесь .
ИСПОЛЬЗОВАНИЕ ЛИЦА
![face](https://i.stack.imgur.com/yNvnI.jpg)
ИСПОЛЬЗОВАНИЕ ГЛАЗА
![eye](https://i.stack.imgur.com/EItMa.jpg)
Размер глаза у меня (12, 32).
face = cv2.imread('face.jpg', 0)
eye = cv2.imread('eye.jpg', 0)
w, h = eye.shape[::-1]
res = cv2.matchTemplate(face,eye,cv2.TM_CCOEFF)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(face ,top_left, bottom_right, 255, 2)
cv2.imshow('image', face)
cv2.waitKey(0)
cv2.destroyAllWindows()
Результат с этим кодом:
![matching eye on face](https://i.stack.imgur.com/5EzLd.png)
Теперь у меня есть верхняя левая и нижняя правая координаты глаза, которые совпадают, где top_left = (112, 108) и bottom_right = (144, 120). Теперь, чтобы расширить их до размеров 36x60, я просто вычитаю необходимые значения из top_left и добавляю необходимые значения в bottom_right.
РЕДАКТИРОВАТЬ 1
Был отредактирован вопрос, который предполагает, что dlib использовался вместе с моделью, обученной выполнять обнаружение левого глаза. Используя тот же код, который я получил
![eye found](https://i.stack.imgur.com/4m3Fy.png)
После этого, как предложено выше, я нахожу top_left = (x,y)
и bottom_right = (x+w, y+h)
.
Теперь, если размер глаза меньше 36x60, нам просто нужно взять область вокруг него, чтобы увеличить его до 36x60, в противном случае мы должны расширить его так, чтобы соотношение сторон не нарушалось, а затем изменялось и не могло быть жестко закодировано. , Полный используемый код:
import dlib
from imutils.face_utils import shape_to_np
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('res/model.dat')
face = cv2.imread('face.jpg', 0)
img = face.copy()
dets = detector(img, 0)
for i, det in enumerate(dets):
shape = shape_to_np(predictor(img, det))
shape_left_eye = shape[36:42]
x, y, w, h = cv2.boundingRect(shape_left_eye)
cv2.rectangle(face, (x, y), (x + w, y + h), (255, 255, 255), 1)
top_left = (x, y)
bottom_right = (x + w, y + h)
if w <= 36 and h <= 60:
x = int((36 - w)/2)
y = int((60 - h)/2)
else:
x1 = w - 36
y1 = h - 60
if x1 > y1:
x = int((w % 3)/2)
req = (w+x) * 5 / 3
y = int((req - h)/2)
else:
y = int((h % 5)/2)
req = (y+h) * 3 / 5
x = int((req - w)/2)
top_left = (top_left[0] - x, top_left[1] - y)
bottom_right = (bottom_right[0] + x, bottom_right[1] + y)
extracted = face[top_left[1]:bottom_right[1], top_left[0]:bottom_right[0]]
result = cv2.resize(extracted, (36, 60), interpolation = cv2.INTER_LINEAR)
cv2.imshow('image', face)
cv2.imshow('imag', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
Что дает нам область глаза 36x60:
![eye extracted](https://i.stack.imgur.com/criww.png)
Это относится к случаю, когда размер глаза меньше 36x60. Во втором случае, когда размер глаза больше 36х60, я использовал face = cv2.resize(face, None, fx=4, fy=4, interpolation = cv2.INTER_CUBIC)
. Результат был:
![eye extracted 2](https://i.stack.imgur.com/FtiG1.png)
Размер обнаруженного глаза равен (95, 33), а выделенная область равна (97, 159), что очень близко к соотношению сторон 3: 5 до изменения размера, что также удовлетворяет этой второй задаче.