Python и получить камеру с лицом управления в реальном масштабе времени

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

После того, как программа начинается, по информации слушателя, используйте время цикл, продолжает загружать видео изображения, а затем возвращаются к инструменту OpenCV представляет информацию об изображении.

Создание слушателя событий клавиатуры, нажмите клавишу «D», а затем начал выполнять согласование лица и маску загрузку (этот процесс является динамическим, вы можете переместить в любое время).

Лицо согласования с помощью алгоритма обнаружения лица Dlib, чтобы увидеть, если есть лицо присутствует. Если да, то это создаст конечное положение, очки и окурки будут двигаться там все к лицу.

Затем нам нужно масштабировать и вращать наши очки, чтобы удовлетворить лицо каждого. Мы будем использовать центр, чтобы найти глаз и рта с точки набора Dlib модель возвращает 68 точек и повернуть пространство между ними.

После того, как мы, наконец, получить в режиме реального времени местоположение сигареты и очки, очки и сигареты в верхней части экрана, стали соответствовать очки и рот.

Если нет человеческого лица, программа будет напрямую вернуться к видеоинформации не будет иметь эффект перемещения маски.

По умолчанию является периодом 4 секунды. После этого вы можете тест-ключ «d» снова.

Выход из программы с помощью клавиши «Q».

Здесь я эта функциональность абстрагируется в службу маски загрузки, пожалуйста , следуйте мой код , чтобы увидеть , что все это.
1. Импорт соответствующий инструментарий

 

от сна импорта времени

импорт CV2
импорт NumPy в нп
от PIL импорта изображения
из imutils импортируют face_utils, изменение размера

попробовать:
    от dlib импорта get_frontal_face_detector, shape_predictor
кроме ImportError:
    поднять


Создайте маску для загрузки его свойства инициализации класса DynamicStreamMaskService соответствующего сервиса:

 

DynamicStreamMaskService класс (объект):
    «» «
    динамическая клей служба маски
    » «»

    __init __ DEF (Self, сохранены = False):
        self.saved = # сохранено для сохранения изображений
        self.listener = True # Параметры запуска
        self.video_capture = cv2.VideoCapture (0) # вызов местной камеры
        self.doing = False # ли лицо маска
        self.speed = 0.1 # маски скорость движения
        self.detector = get_frontal_face_detector () # лица распознаватель
        self.predictor = shape_predictor ( "shape_predictor_68_face_landmarks.dat") # лицевой анализатор
        self.fps = 4 существует период времени на основе маски #
        самостоятельно. animation_time = 0 # начальное значение анимации цикла
        self.duration = self.fps * 4 # анимация цикла максимум
        self.fixed_time = # 4 после нанесения, время пребывания
        self.max_width = 500 # размер изображения
        self.deal, self.text, само .cigarette = None, None, None # маска объекты


В соответствии с вышеуказанным введением, мы сначала реализовать функцию чтения видеопоток в изображение:

 

read_data DEF (Self):
    «» «
    получает видеопоток с камеры, а изображение преобразуется в кадр
    : возвращение: Возвращает информацию об образе
    » «»
    _ = self.video_capture.read Data ()
    возврат данные


Далее, мы понимаем функцию определения местоположения лица и расположение стекол и сигарет:

 

Защиту get_glasses_info (самоощущение, face_shape, face_width):
    "" "
    获取当前面部的眼镜信息
    : пары face_shape:
    : пары face_width:
    : возвращение:
    """
    left_eye = face_shape [36:42]
    right_eye = face_shape [42:48]

    left_eye_center = left_eye.mean (ось = 0) .astype ( "Int")
    right_eye_center = right_eye.mean (ось = 0) .astype ( "Int")

    у = left_eye_center [1] - right_eye_center [1]
    х = left_eye_center [0] - right_eye_center [0]
    eye_angle = np.rad2deg (np.arctan2 (у, х))

    сделка = self.deal.resize (
        (face_width, Int (face_width * self.deal.size [1] / self.deal.size [0])),
        частоты дискретизации = Image.LANCZOS)

    сделка = deal.rotate (eye_angle, расширение = True)
    сделки = deal.transpose (Image.FLIP_TOP_BOTTOM)

    left_eye_x = left_eye [0, 0] - face_width // 4
    left_eye_y = left_eye [0, 1] - face_width // 6

    вернуться { "образ": сделка, "позиция": (left_eye_x, left_eye_y)}

Защиту get_cigarette_info (самостоятельный, face_shape, face_width):
    "" "
    获取当前面部的烟卷信息
    : пары face_shape:
    : пары face_width:
    : возвращение:
    """
    Рот = face_shape [49:68]
    mouth_center = mouth.mean (ось = 0 ) .astype ( "Int")
    сигареты = self.cigarette.resize (
        (face_width, Int (face_width * self.cigarette.size [1] / self.cigarette.size [0])),
        частоты дискретизации = Image.LANCZOS)
    х = рот [0, 0] - face_width + INT (16 * face_width / self.cigarette.size [0])
    у = mouth_center [1]
    возвращение { "образ": сигареты, "позы": (х, у)}

Защита ориентация (сам, прямоугольники, img_gray):
    "" "
    人脸定位
    : возвращение:
    """
    лица = []
    для прямоугольника в прямоугольниках:
        лицо = {}
        face_shades_width = rect.right () - rect.left ()
        predictor_shape = self.predictor (img_gray, прямоугольник)
        face_shape = face_utils.shape_to_np (predictor_shape)
        лицо [ 'сигареты'] = self.get_cigarette_info (face_shape, face_shades_width)
        лицо [ 'очки'] = self.get_glasses_info (face_shape, face_shades_width)

        faces.append (лицо)

    вернуться лица


Мы только что упомянули клавиатуру для прослушивания событий, где мы понять, что эта функция:

 

listener_keys DEF (Self):
    "" "
    Установить монитор клавиатуры события
    : возвращение:
    " ""
    Key = cv2.waitKey (1) & 0xFF
    IF Key == Ord ( "Q"):
        self.listener = False
        self.console ( " программа выходит «)
        СОН (1)
        self.exit ()

    если ключ == Ord ( "d"):
        self.doing = не self.doing


Далее мы понимаем функцию, чтобы загрузить информацию о маске:

 

Защиту init_mask (сам):
    "" "
    加载面具
    : возвращение:
    """
    self.console ( "加载面具...")
    self.deal, self.text, self.cigarette = (
        Image.open (х) для х в [ "изображений / deals.png", "изображений / text.png", "картинки / cigarette.png"]
    )


Основные функции выше будут реализованы, мы понимаем, функции рисования, а также принцип действия и, прежде чем я написал эссе с технологией распознавания лиц AI для достижения эффекта вибрато одно и то же, я не буду вдаваться в подробности, вы можете пойти GitHub Python китайское сообщество или ракурс номер общественного микро-канал.

 

Защита рисунка (я, draw_img, лица):
    "" "
    画图
    : пары draw_img:
    : пары лицо:
    : возвращение:
    """
    для лица в лицах:
        если self.animation_time <self.duration - self.fixed_time:
            current_x = INT ( лицо [ "очки"] [ "POS"] [0])
            current_y = INT (лицо [ "очки"] [ "POS"] [1] * self.animation_time / (self.duration - self.fixed_time))
            draw_img. паста (лицо [ "очки"] [ "образ"], (current_x, current_y), лицо [ "очки"] [ "изображение"])

            cigarette_x = INT (лицо [ "сигарета"] [ "позы"] [0])
            cigarette_y = INT (лицо [ "сигарета"] [ "позы"] [1] * self.animation_time / (self.duration - self.fixed_time ))
            draw_img.paste (лицо [ "сигарета"] [ "образ"], (cigarette_x, cigarette_y),
                           лицо [ "сигарета"] [ "образ"])
        остальное:
            draw_img.paste (лицо [ "очки"] [» изображение "], [лицо" очки "] [" POS "], лицо [" очки "] [" образ "])
            draw_img.paste (лицо [" сигарета "] [" образ "], лицо [" сигарета "] [ "позы"], лицо [ "сигарета"] [ "образ"])
            draw_img.paste (self.text, (75,draw_img.height // 2 + 128), self.text)


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

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

Защиту начать (себя):
    "" "
    启动程序
    : возвращение:
    """
    self.console ( "程序启动成功.")
    self.init_mask () в
    то время как self.listener:
        рама = self.read_data ()
        кадр = размер (рама , ширина = self.max_width)
        img_gray = cv2.cvtColor (рама, cv2.COLOR_BGR2GRAY)
        прямоугольники = self.detector (img_gray, 0)
        лица = self.orientation (прямоугольники img_gray)
        draw_img = Image.fromarray (cv2.cvtColor (кадр , cv2.COLOR_BGR2RGB)) ,
        если self.doing:
            self.drawing (draw_img, лица)
            self.animation_time + = self.speed
            self.save_data (draw_img)
            если self.animation_time> self.duration:
                self.doing = False
                self.animation_time = 0
            еще:
                кадр = cv2.cvtColor (np.asarray (draw_img), cv2.COLOR_RGB2BGR)
        cv2.imshow ( "привет маска", рамка)
        я .listener_keys ()

Защита выход (Я):
    "" "
    程序退出
    : возвращение:
    """
    self.video_capture.release ()
    cv2.destroyAllWindows ()


Наконец, давайте попробуем:

 

если __name__ == '__main__':
    мс = DynamicStreamMaskService ()
    ms.start ()


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

 

--------------------- 

рекомендация

отwww.cnblogs.com/ly570/p/10942301.html