Создайте 3D-ориентир на лице в реальном времени

В этой статье мы увидим, как можно выполнить обнаружение сетки лица с помощью Python OpenCV напрямую через файл изображения, веб-камеру или видеофайл.

Прежде всего, вам необходимо установить OpenCV и Numpy. Мы будем делать это руководство, используя готовый язык программирования Python, так что приступим.

MediaPipe работает с исследователями и разработчиками решений и приложений для машинного обучения на мобильных устройствах, в веб-приложениях, периферийных вычислениях и т. д.

Нам нужно импортировать CV2, mediapipe и время для настройки базы проекта.

Чтобы установить mediapipe, выполните следующую команду для установки через pip.

pip install mediapipe

OpenCV Python

OpenCV - это библиотека для обработки изображений. Он предназначен для решения задач компьютерного зрения. OpenCV - это библиотека C / C ++, расширенная в Python.

Теперь создайте файл типа faceMeshDetection.py

Импортируйте все нужные нам пакеты.

import cv2
import mediapipe as mp
import time

time() function принимает числа с плавающей запятой и возвращает текущее время в секундах с начала эпохи. Могут присутствовать доли секунды, если их обеспечивают системные часы.

cv2.VideoCapture (путь_к видео)

Эта функция просто настраивает путь видео. Вы можете изменить путь к видео по своему усмотрению. Путь может быть веб-камерой, видеофайлом или внешней камерой.

Здесь мы указываем путь к видео в следующем коде.

cap = cv2.VideoCapture(‘/home/python/OpenCV/faceMash/mesh.mp4’)

Если вы используете веб-камеру, сделайте следующее

cap = cv2.VideoCapture(0) #depends on your system 0 or 1

Установить частоту кадров

Настройте частоту кадров, как показано ниже.

presentTime = 0
    # fps control
    currentTime = time.time()
    fps_rate = 1 / (currentTime - presentTime)
    presentTime = currentTime

Обнаружение сетки лица в MediaPipe.

MediaPipe Face Mesh Detection обрабатывает изображение в формате RGB и возвращает список обнаруженных данных о местоположении лиц.

mpDraw = mp.solutions.drawing_utils
mpFaceMesh = mp.solutions.face_mesh
faceMesh = mpFaceMesh.FaceMesh(max_num_faces = 2)
drawSpec = mpDraw.DrawingSpec(thickness=1, circle_radius=1)

Функция cv2.imread (filename):

imread( filename [ , flags ] ) загружает изображение из файла. Функция imread загружает изображение из указанного файла и возвращает его.

cv2.cvtColor (src, code [, dst [, dstCn]])

Преобразует изображение из одного цветового пространства в другое. Функция преобразует входное изображение из одного цветового пространства в другое. В случае трансформации. от цветового пространства RGB , порядок каналов следует указывать явно ( RGB или BGR ). Примечание . что формат цвета по умолчанию в OpenCV часто называют RGB, но на самом деле это BGR ( байты перевернуты ).

process (self, image: np.ndarray) function faceDetection

Обрабатывает изображение RGB и возвращает список данных о местоположении обнаруженного лица. Принимает на входе изображение. Изображение RGB, представленное как ndarray NumPy.

Аргументы:

draw_detection(image, detection,keypoint_drawing_spec,bbox_drawing_spec) function Рисует ограничительную рамку обнаружения и ключевые точки на изображении. Обсудим все параметры.

  1. image: трехканальное изображение RGB, представленное как NumPy ndarray.
  2. detection: Протокол обнаружения, который будет аннотироваться на изображении.
  3. keypoint_drawing_spec: объект DrawingSpec, который определяет параметры рисования ключевых точек, такие как цвет, толщина линии и радиус круга, например DrawingSpec = DrawingSpec (color = RED_COLOR).
  4. bbox_drawing_spec: объект DrawingSpec, определяющий ограничивающие рамки. Параметры рисования, такие как цвет и толщина линии, например DrawingSpec = DrawingSpec ()).
while True:
    success, img = cap.read()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    results = faceMesh.process(imgRGB)
    if results.multi_face_landmarks:
        for faceLms in results.multi_face_landmarks:
            mpDraw.draw_landmarks(img, faceLms, mpFaceMesh.FACE_CONNECTIONS, drawSpec, drawSpec)
            for id, lm in enumerate(faceLms.landmark):
                ih, iw, ic = img.shape
                x, y = int(lm.x*iw), int(lm.y*ih)
cv2.putText(img, text, org, fontFace, fontScale, color[ , thickness[ , lineType[, bottomLeftOrigin]]])

Здесь объясняются все параметры

  1. img: input Рисует текстовую строку,
  2. text: текстовая строка для рисования.
  3. org: нижний левый угол текстовой строки изображения.
  4. fontFace: тип шрифта ,
  5. fontScale: коэффициент масштабирования шрифта, умноженный на базовый размер шрифта.
  6. color: цвет текста.
  7. thickness: Толщина линий, используемых для рисования текста.
  8. lineType: Тип линии.
  9. bottomLeftOrigin: при значении "истина" , источник данных изображения находится в нижнем левом углу. В противном случае , он находится в верхнем левом углу.

Показать функцию изображения cv2.imshow ().

Ориентиры по лицам - это 467 точек, которые отслеживаются по лицу пользователя. См. Следующий код ниже.

Полный исходный код

Это изображение было взято из видеофайла.

Это изображение было снято с использованием файла изображения.

Заключение

Здесь я только что объяснил полный проект Face Mash, и вы можете использовать код для настройки по своему усмотрению. Там вы найдете множество идей, которые можно расширить от базового проекта сетки. Большое спасибо за чтение.

Хорошего дня.

Больше контента на plainenglish.io