怎么用Python获取摄像头并实时控制人的脸

  介绍

小编给大家分享一下怎么用Python获取摄像头并实时控制人的脸,希望大家阅读完这篇文章之后都有所收获、下面让我们一起去探讨吧!

Python可以做什么

Python是一种编程语言,内置了许多有效的工具,Python几乎无所不能,该语言通俗易懂,容易入门,功能强大,在许多领域中都有广泛的应用,例如最热门的大数据分析,人工智能,网页开发等。

<强>实现流程

从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像(就像你使用本地静态图片一样)

程序启动后,根据监听器信息,使用一个而循环,不断的加载视频图像,然后返回给opencv工具呈现图像信息。

创建一个键盘事件监听,按下“d"键,则开始执行面部匹配,并进行面具加载(这个过程是动态的,你可以随时移动)。

面部匹配使用Dlib中的人脸检测算法来查看是否有人脸存在。如果有,它将为每个人脸创建一个结束位置,眼镜和烟卷会移动到那里结束。

然后我们需要缩放和旋转我们的眼镜以适合每个人的脸。我们将使用从Dlib的68点模型返回的点集来找到眼睛和嘴巴的中心,并为它们之间的空间旋转。

在我们实时获取眼镜和烟卷的最终位置后,眼镜和烟卷从屏幕顶部进入,开始匹配你的眼镜和嘴巴。

假如没有人脸,程序会直接返回你的视频信息,不会有面具移动的效果。

默认一个周期是4秒钟,然后你可以通过“d"键再次检测。

程序退出使用“q"键。

这里我将这个功能抽象成一个面具加载服务,请跟随我的代码一窥究竟吧。

1。导入对应的工具包

得到time  import 睡眠      import  cv2   import  numpy  as  np   得到PIL  import 形象   得到imutils  import  face_utils,调整      试一试:   得到才能dlib  import  get_frontal_face_detector, shape_predictor   except  ImportError:   提高才能

创建面具加载服务类DynamicStreamMaskService及其对应的初始化属性:,

class  DynamicStreamMaskService(对象):   “才能”;“   动才能态黏贴面具服务   “才能”;“      def 才能__init__(自我,,救了=False):   ,,,self.saved =, 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, #,面具存在时间基础时间   ,,,self.animation_time =, 0, #,动画周期初始值   ,,,self.duration =, self.fps  *, 4, #,动画周期最大值   ,,,self.fixed_time =, 4, #,画图之后,停留时间   ,,,self.max_width =, 500, #,图像大小   self.deal,,,,,, self.cigarette  self.text=,,,没有,,None  #,面具对象以前

按照上面介绍,我们先实现读取视频流转换图片的函数:,

def  read_data(自我):   “才能”;“   从才能摄像头获取视频流,并转换为一帧一帧的图像   ,,:返回:返回一帧一帧的图像信息   “才能”;“   _,才能,data =, self.video_capture.read ()   return 才能;数据

接下来我们实现人脸定位函数,及眼镜和烟卷的定位:,

def  get_glasses_info (face_shape,自我,还以为;face_width):   “才能”;“   获才能取当前面部的眼镜信息   :才能param  face_shape:   :才能param  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")      y 才能=,left_eye_center[1],安康;right_eye_center [1]   x 才能=,left_eye_center[0],安康;right_eye_center [0]   时间=eye_angle 才能;np.rad2deg (np.arctan2 (y), x))      时间=deal 才能;self.deal.resize (   ,,,(face_width, int (face_width  *, self.deal.size [1],/, self.deal.size [0])),   ,,,重新取样=Image.LANCZOS)      时间=deal 才能;deal.rotate (eye_angle,,扩大=True)   时间=deal 才能;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      return 才能{“image":交易,“pos":, (left_eye_x, left_eye_y)}      def  get_cigarette_info (face_shape,自我,还以为;face_width):   “才能”;“   获才能取当前面部的烟卷信息   :才能param  face_shape:   :才能param  face_width:   ,,:返回:   “才能”;“   时间=mouth 才能;face_shape [49:68]   时间=mouth_center 才能;mouth.mean(轴=0).astype (“int")   时间=cigarette 才能;self.cigarette.resize (   ,,,(face_width, int (face_width  *, self.cigarette.size [1],/, self.cigarette.size [0])),   ,,,重新取样=Image.LANCZOS)   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

怎么用Python获取摄像头并实时控制人的脸