Рубрики
Без рубрики

Smilefie: Как вы можете автоматически захватывать Selfies, обнаруживая улыбку

Автор оригинала: FreeCodeCapm Team.

Ришав Агарваль

Десять вторая на вынос: используйте Python и OpenCV, чтобы создать приложение, которое автоматически запечатлевает Selfie при обнаружении улыбки. Теперь давайте попадаем в это.:)

Я наткнулся на это Реклама Для OPPO – телефон автоматически захватывает селфи, когда красивая актриса улыбается в камеру. Это казалось довольно легкой проблемой, учитывая прекрасную DLIB Библиотека из Python.

В этом посте я расскажу о том, как вы можете создать подобное приложение, которое захватывает селфи из веб-камеры при обнаружении улыбки. Все в ~ 50 линиях кода Отказ

Обзор процесса

  1. Используйте детектор ориентир на лице в DLIB, чтобы получить координаты рта
  2. Установите порог улыбки, используя соотношение сторон рта (Mar)
  3. Доступ к веб-камеру, чтобы настроить живой поток
  4. Захватить изображение
  5. Сохранить изображение
  6. Закрыть кулачок

Требуется библиотеки

  • Numpy: Используется для быстрой матричной расчеты и манипуляций.
  • DLIB : Библиотека, содержащая ориентиры лица.
  • CV2 : Открытая библиотека CV, используемая для манипулирования и экономией изображения.
  • Scipy.spatial : Используется для расчета евклидового расстояния между точками лица.
  • Имутилс : Библиотека для доступа к видеопотоку.

Все библиотеки могут быть установлены с помощью PIP, кроме ДЛИБ. Для DLIB мы должны установить Cmake и Boost Отказ Вот как установить их на MacOS, используя варить Отказ

Если у вас нет варева, Вот как установить Домашний вид Отказ

Установите Cmake

brew install cmake

Установите повышение

brew install boostbrew install boost-python --with-python3

Вторая команда гарантирует, что усиление используется с Python 3 Отказ

Установите DLIB

После этого мы можем установить DLIB, используя

pip install dlib

Совет: Мне нравится использовать Анаконда, Виртуальная среда для каждого отдельного проекта. Здесь отличный блог на двоих и как Кондей среда.

Импорт библиотек

from scipy.spatial import distance as distfrom imutils.video import VideoStream, FPSfrom imutils import face_utilsimport imutilsimport numpy as npimport timeimport dlibimport cv2

Ориентир ориентир на лице

Ориентир ориентир лица является API, реализованный внутри DLIB Отказ Это производит 68 X-Y-координаты эта карта к конкретным структурам лица.

Это может быть визуализировано как:

Мы сосредоточимся на устье, который можно получить в течение точечного диапазона [49, …, 68]. Есть двадцать координат.

Используя DLIB, мы можем получить эти функции, используя следующий код:

shape_predictor= "../shape_predictor_68_face_landmarks.dat"detector = dlib.get_frontal_face_detector()predictor = dlib.shape_predictor(shape_predictor)(mStart, mEnd) = face_utils.FACIAL_LANDMARKS_IDXS["mouth"]

(MStart, Mend) Получает нам первые и последние координаты для рта.

Вы можете скачать предварительно обученный файл ориентира здесь или просто Email Я и я отправлю это тебе. Не забудьте извлечь его.

Функция улыбки

Изображение ниже показывает только двадцать координаты рта:

Я создал соотношение сторон рта (Mar), вдохновленный двумя статьями на обнаружении мигания. Это Обнаружение глаз мнения в реальном времени с использованием ориентиров на лице Отказ и Обнаружение мрачных глаз с OpenCV, Python и DLIB Отказ Вторая статья расширяется первым. Оба обсуждают соотношение сторон в этом случае для глаз (уха):

Формула для уха есть:

D между P1 и P4

L = среднее расстояние между p2 и p6; P3 и P5.

EAR= L/D

В нашем случае мар Мар определяется просто как отношения точек, показанных ниже

Мы вычисляем расстояние между P49 и P55 как D, и мы в среднем расстояния между:

P51 и P59.

P52 и P58.

P53 и P57.

Давайте назовем это l, используя ту же структуру именования:

MAR = L/D

Вот функция для расчета марки.

def smile(mouth): A = dist.euclidean(mouth[3], mouth[9]) B = dist.euclidean(mouth[2], mouth[10]) C = dist.euclidean(mouth[4], mouth[8]) L = (A+B+C)/3 D = dist.euclidean(mouth[0], mouth[6]) mar=L/D return mar

Совет: Когда мы сращиваем массив точка 49 становится первым элементом массива (0), и все остальные показатели регулируются соответственно:

Улыбаясь с закрытым ртом увеличивает расстояние между P49 и P55 и уменьшает расстояние между верхней и нижней точками. Итак, L будет уменьшаться, а D увеличатся.

Улыбаясь с открытым ртом, приводит к снижению и увеличения.

Посмотрите, как менять марки, когда я меняю формы рта:

Исходя из этого, я улыбнулся, чтобы быть Мар <.3 или & GT; .38. Я мог бы сделать только D Как D всегда увеличится, когда человек улыбается. Но буду не будет же для всех, так как люди имеют разные формы рта.

Это грубые оценки и могут включать другие эмоции, такие как «AWE». Чтобы преодолеть это, вы можете создать более продвинутую модель. Вы можете принять во внимание больше объектов для лица или просто обучить классификатор эмоций на основе CV.

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

Захват видео

Доступ к веб-камеру

Мы можем получить доступ к веб-камеру через библиотеку Imutils, используя следующую команду. cv2.namedwindow Создает новое окно:

vs = VideoStream(src=0).start()fileStream = Falsetime.sleep(1.0)cv2.namedWindow('frame',cv2.WINDOW_NORMAL)

Обнаружение лица

Теперь мы приходим на главный цикл, где происходит волшебство. Сначала мы захватываем один кадр и преобразуем его в серого для легкого вычисления. Мы используем это, чтобы обнаружить лицо. cv2.convexhull (рот) обнаруживает рот наброски и cv2.drawcontours Рисует зеленый контур вокруг него.

while True: frame = vs.read() frame = imutils.resize(frame, width=450) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) rects = detector(gray, 0) for rect in rects:  shape = predictor(gray, rect)  shape = face_utils.shape_to_np(shape)  mouth= shape[mStart:mEnd]  mar= smile(mouth)  mouthHull = cv2.convexHull(mouth)  cv2.drawContours(frame, [mouthHull], -1, (0, 255, 0), 1)

Совет : Эта настройка может обнаружить несколько улыбается в одном кадре.

Автоматический захват

Далее мы устанавливаем состояние автоматического захвата:

if mar <= .3 or mar > .38 : COUNTER += 1 else:  if COUNTER >= 15:   TOTAL += 1   frame = vs.read()   time.sleep(0.3)   img_name = "opencv_frame_{}.png".format(TOTAL)   cv2.imwrite(img_name, frame)   print("{} written!".format(img_name))   cv2.destroyWindow("test")  COUNTER = 0

Здесь я считаю улыбкой быть «селфи достойной», если человек держит его за полторы или 30 кадров.

Мы проверяем, есть ли Мар <.3 или & g t; .38 по крайней мере 15 кадров, а затем сохранить 16-й кадр. Файл сохраняется в той же папке, что и код с именем “openc_frame_ .png”.

Я добавил несколько Time.sleep функции, чтобы сгладить опыт. Телефоны обычно получают эти вопросы оборудования, используя хитрости, такие как анимации или загрузки экранов.

Совет: Эта часть находится внутри цикла в то время как.

Мы также распечатаем мар Мар на раме с CV2.PUTTEXT Функция:

cv2.putText(frame, "MAR: {}".format(mar), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

Совет : Мой Mac имеет 30 камер FPS, поэтому я использовал 30 как количество кадров. Вы можете изменить это соответственно. Проще, чтобы найти FPS – это использовать функцию FPS в Imutils.

Выйдите из потокового видео

Наконец, поставьте команду Quit, которая останавливает потоковую передачу видео, когда нажата клавиша «q». Это достигается путем добавления:

key2 = cv2.waitKey(1) & 0xFF if key2 == ord('q'): break

Наконец, мы разрушаем окно, используя

cv2.destroyAllWindows()vs.stop()

И мы закончили!

Весь код в действии:

Вы можете найти весь код на моем Github Отказ

Это было базовое применение удивительной библиотеки DLIB. Отсюда вы можете продолжать создавать такие вещи, как ваши собственные Фильтры Snapchat , Высокотехнологичное домашнее наблюдение системы или даже постревенский детектор счастья.

Tweet У меня на случай, если вы в конечном итоге делаете все более классные вещи с этим или найдите лучший детектор улыбки. Еще одна прохладная идея состоит в том, чтобы сделать некоторую почтусную обработку на захваченное изображение (как в рекламе), чтобы сделать картину красивее.

Спасибо за прочтение. Если вам понравилось то, что вы читаете, хлопать, и следуйте за мной. Это будет много значить и побудить меня писать больше. Давайте подключемся к Twitter и LinkedIn также:)