В этом посте объясняется, как мы можем воспользоваться алгоритмом сегментации кожи, описанным в моей первой статье, и как мы можем использовать его для распознавания лиц.
Что такое распознавание лиц?
Распознавание лиц — это процесс поиска и извлечения лица из любого заданного изображения, видео, веб-камеры… на основе определенных характеристик (цвет кожи, нос, глаза, рот…). Этот метод используется в программе для распознавания лица (проверить, знакомое оно или незнакомое лицо) и осуществляется с помощью цветовой сегментации изображения. Для этого 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
Согласно документации:
у нас есть два варианта:
- Прямой прямоугольник.
- Повернутый прямоугольник.
Поскольку мы хотим нарисовать прямые линии вокруг лица, нам нужно выбрать метод прямого прямоугольника.
Код Python:
Запустив приведенный выше фрагмент кода, программа нарисует контурное изображение:
Теперь наша цель — нарисовать прямоугольник вокруг этого контура с помощью метода boundingRect, который нарисует Прямой прямоугольник.
предыдущий код вернет координаты лица, как показано на следующем изображении:
Распознавание лиц в видео
мы можем улучшить нашу программу для обнаружения лиц в данном видео.
Идея состоит в том, чтобы извлечь кадр из предоставленного видео для каждой итерации цикла while и применить предыдущую процедуру для получения координат лица в этом кадре. Но при этом нужно учитывать частоту кадров, которая на входе равна fps(30 кадров/сек). поэтому, чтобы решить эту проблему и получить плавный переход между кадрами, нам нужно оценить время обработки от первой итерации цикла до последней.
На этом этапе вам нужно приостановить итератор Python на (1/fps-(finish-start)) сек. Делая это, мы обеспечиваем 30 кадров в секунду в качестве входной частоты кадров.
scale_factor используется для изменения размера изображения для быстрого вычисления координат лица.
Вывод
На мой взгляд, сегментация кожи — один из самых мощных методов, которые можно использовать для распознавания лиц, сохраняя при этом хорошую производительность и более высокую частоту кадров.
Если вам нравится мой проект, пожалуйста, ознакомьтесь с исходным кодом в моем репозитории и не стесняйтесь разветвлять его и делать запросы на вытягивание, предоставив свои изменения в нем, я буду признателен за это!