Процесс реализации ,
полученный из видеопотока камеры, и преобразуется в изображение одного, а затем передает информацию в библиотеке обработки изображений 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 ()
Я пишу вам, эта маленькая особенность была достигнута, мы можем также использовать что-то посмотреть.
---------------------