当前位置: 首页 > 科技观察

人脸识别也可以这样玩

时间:2023-03-13 22:26:19 科技观察

今天我们就来展开一下,用人脸来玩飞机大战。虽然思路和手势识别差不多,但是代码量比手势识别版略大。采用的人脸算法为毫秒级,帧率可达30帧,电脑CPU运行流畅。下面分享项目实现过程,文末获取项目完整源码。准备飞机大战程序在Github上找一个Python版的飞机大战程序,安装Pygame运行。使用键盘上的A、D、W、S键控制飞行器的运动方向,分别对应左、右、上、下。因此,接下来我们要做的就是识别人脸,估计人脸的姿态,并将估计的结果映射到左、右、上、下,从而控制飞行器的运行。人脸识别这里我们使用opencv读取摄像头中的视频流。将视频流中的每一帧发送给mediapipe中的人脸识别模型进行识别。imagemediapipe不仅可以识别人脸,还可以标记人脸的6个关键点:左眼、右眼、左耳、右耳、鼻子、嘴巴。内核代码:withself.mp_face_detection.FaceDetection(model_selection=0,min_detection_confidence=0.9)asface_detection:whilecap.isOpened():success,image=cap.read()image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)结果=face_detection.process(image)image=cv2.cvtColor(image,cv2.COLOR_RGB2BGR)ifresults.detections:fordetectioninresults.detections:#获取人脸框坐标face_box=detection.location_data.relative_bounding_boxface_w,face_h=int(face_box.width*frame_w),int(face_box.height*frame_h)face_l=int(face_box.xmin*frame_w)+face_wface_t=int(face_box.ymin*frame_h)face_r,face_b=face_l-face_w,face_t+face_h#显示人脸框cv2.rectangle(image,(face_l,face_t),(face_r,face_b),(0,255,255),2)self.draw_zh_img(image,self.face_box_name_img,(face_r+face_l)//2,face_t-5)pose_direct,pose_key_points=self.pose_estimate(detection)#在FaceKeyPoint中为point_name显示人脸的6个关键点:mp_point=self.mp_face_detection.get_key_point(detection,point_name)point_x=int(mp_point.x*frame_w)point_y=int(mp_point.y*frame_h)point_color=(0,255,0)ifpoint_nameinpose_key_pointselse(255,0,255)cv2.circle(image,(point_x,point_y),4,point_color,-1)#显示关键点的中文名称point_name_img=self.face_key_point_name_img[point_name]self.draw_zh_img(image,point_name_img,point_x,point_y-5)这里有一个大家需要的小知识点代码中要注意使用draw_zh_img来显示中文,因为opencv不支持直接显示中文。因此,我使用PIL模块中的Image方法提前绘制中文图片,并转为opencv格式。需要时直接与视频流合并,高效不掉帧。在进行人脸姿态估计的手势识别之前,我们使用相邻帧来判断手势运动。人脸姿态估计只需要使用当前帧,相对容易。我们可以通过人脸6个关键点的坐标距离来判断人脸的姿态。在这里,左耳和鼻子之间的水平距离非常近。因此,我们可以估计人脸向左转,这样我们就可以只用平面向左移动。.同理,利用其他关键点,我们可以估计脸部右转,向上(headup)和向下(headdown)核心代码:#左耳到鼻子的水平距离,判断脸部向左转left_ear_to_nose_dist=left_ear.x-nose_pos.x#右耳到鼻子的水平距离,判断脸向右转nose_to_right_ear_dist=nose_pos.x-right_ear.x#鼻子到左眼的垂直距离,判断脸朝上nose_to_left_eye_dist=nose_pos.y-left_eye.y#左耳垂直于左眼距离,判断脸朝下left_ear_to_left_eye_dist=left_ear.y-left_eye.yifleft_ear_to_nose_dist<0.07:#print('turnleft')self.key_board.press_key('A')time.sleep(0.07)self.key_board.release_key('A')return'A',[FaceKeyPoint.NOSE_TIP,FaceKeyPoint.LEFT_EAR_TRAGION]ifnose_to_right_ear_dist<0.07:#print('turnright')self.key_board.press_key('D')time.sleep(0.07)self.key_board.release_key('D')返回'D',[FaceKeyPoint.NOSE_TIP,FaceKeyPoint.RIGHT_EAR_TRAGION]姿态控制飞行器运动识别人脸姿态,我们可以通过程序控制键盘来控制飞行器的运动。这里我使用PyKeyboard模块来控制键盘按键。self.key_board=PyKeyboard()#print('turnleft')self.key_board.press_key('A')time.sleep(0.07)self.key_board.release_key('A')press_key和release_key函数分别是key和release按钮。其中调用了time.sleep(0.07)来控制按键时长。如果长时间按下按钮,飞行器将飞行很长的距离。相反,如果短按按钮,飞行器将飞行一小段距离。您可以根据需要进行调整。

猜你喜欢