В этом посте объясняется, как мы можем воспользоваться алгоритмом сегментации кожи, описанным в моей первой статье, и как мы можем использовать его для распознавания лиц.

Что такое распознавание лиц?

Распознавание лиц — это процесс поиска и извлечения лица из любого заданного изображения, видео, веб-камеры… на основе определенных характеристик (цвет кожи, нос, глаза, рот…). Этот метод используется в программе для распознавания лица (проверить, знакомое оно или незнакомое лицо) и осуществляется с помощью цветовой сегментации изображения. Для этого Python предоставляет нам полезную функцию: cv2.findContours.

функция findContours.

Используя библиотеку OpenCV, вы можете извлечь контур изображения. Функция, выполняющая эту задачу, как следует из названия, находит контуры, которая имеет следующий синтаксис:

contours, hierarchy=cv2.findContours(image, mode, method[,contours[, hierarchy[, offset]]])

1- Изображение: 8-битное бинарное изображение, в котором мы хотим найти контуры.

2- Режим: один из четырех режимов:

  • Cv2. RETR _ВНЕШНИЙ:

Извлеките только самый внешний контур. Если есть контур внутри, он будет проигнорирован. Самая внешняя матрица изображения не выделяется как контур.

вывод:

[array ([[[1, 1]],
[[1, 9]],
[[2, 9]],
[[3, 8]],
[[5, 8]],
[[5, 9]],
[[10, 9]],
[[10, 1]],
[[6, 1]],
[[5, 2]],
[[4, 2]],
[[3, 1]],
[[2, 1]]])]

Как видите, каждая точка контура представлена ​​как [[x, y]], а вывод содержит только один массив (cont1 ), а cont2 был проигнорирован. Порядок обнаружения следующий: против часовой стрелки в направлении увеличения y, если x фиксировано, и в направлении увеличения x, если y фиксировано.

Поскольку я хочу обнаружить самый внешний контур, я буду использовать этот режим в своей программе. Для получения дополнительной информации о других режимах вы можете ознакомиться с OpenCv docs

3- Метод. Существует три метода упаковки контуров:

a- Cv2.CHAIN_APPROX_SIMPLE —объединить все горизонтальные, вертикальные и диагональные контуры;

b- Cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS — применяет метод упаковки Teh-Chin;

c-cv2.CHAIN_APPROX_NONE — без упаковки и все контуры хранятся в виде сегментов, состоящих из двух пикселей;

Таким образом, при чтении этих параметров очевидно, что следует выбрать метод cv2.CHAIN_APPROX_SIMPLE.

Ради простоты мне подходят эти три параметра, потому что они отлично справятся со своей задачей.

4- Возвращаемые значения:

contours : a list of all found contours represented as a matrix
hierarchy : information about the topology of the contours.

В этом проекте наша цель — нарисовать прямоугольник вокруг лиц. Таким образом, идея состоит в том, чтобы воспользоваться преимуществами методов findContours и boundingRect, которые дают нам базовые координаты x, y, а также ширину и высоту заданного контура (вверху слева и внизу). правильные точки).

x, y, w, h = cv2.boundingRect(contours)# contours is an array list of contours

Согласно документации:

у нас есть два варианта:

  1. Прямой прямоугольник.
  2. Повернутый прямоугольник.

Поскольку мы хотим нарисовать прямые линии вокруг лица, нам нужно выбрать метод прямого прямоугольника.

Код Python:

Запустив приведенный выше фрагмент кода, программа нарисует контурное изображение:

Теперь наша цель — нарисовать прямоугольник вокруг этого контура с помощью метода boundingRect, который нарисует Прямой прямоугольник.

предыдущий код вернет координаты лица, как показано на следующем изображении:

Распознавание лиц в видео

мы можем улучшить нашу программу для обнаружения лиц в данном видео.

Идея состоит в том, чтобы извлечь кадр из предоставленного видео для каждой итерации цикла while и применить предыдущую процедуру для получения координат лица в этом кадре. Но при этом нужно учитывать частоту кадров, которая на входе равна fps(30 кадров/сек). поэтому, чтобы решить эту проблему и получить плавный переход между кадрами, нам нужно оценить время обработки от первой итерации цикла до последней.

На этом этапе вам нужно приостановить итератор Python на (1/fps-(finish-start)) сек. Делая это, мы обеспечиваем 30 кадров в секунду в качестве входной частоты кадров.

scale_factor используется для изменения размера изображения для быстрого вычисления координат лица.

Вывод

На мой взгляд, сегментация кожи — один из самых мощных методов, которые можно использовать для распознавания лиц, сохраняя при этом хорошую производительность и более высокую частоту кадров.

Если вам нравится мой проект, пожалуйста, ознакомьтесь с исходным кодом в моем репозитории и не стесняйтесь разветвлять его и делать запросы на вытягивание, предоставив свои изменения в нем, я буду признателен за это!