오늘은 이를 확장해서 사람 얼굴로 비행기 전투를 해보겠습니다. 동작 인식과 아이디어는 유사하지만 코드 양은 동작 인식 버전에 비해 약간 더 많습니다.
사용된 얼굴 알고리즘은 밀리초 수준이고 프레임 속도는 30에 도달할 수 있으며 컴퓨터 CPU에서 매우 원활하게 실행됩니다.
이제 프로젝트 구현 과정을 공유하고, 기사 마지막 부분에서 프로젝트의 전체 소스 코드를 얻으겠습니다.
Github에서 항공기 전쟁 프로그램의 Python 버전을 찾아 Pygame을 설치하고 실행하세요.
키보드의 A, D, W, S 키를 사용하여 각각 왼쪽, 오른쪽, 위, 아래에 해당하는 기체의 이동 방향을 제어하세요.
그럼 다음으로 해야 할 일은 얼굴을 인식하고, 얼굴 자세를 추정하고, 추정된 결과를 왼쪽, 오른쪽, 위, 아래로 매핑하여 항공기의 작동을 제어하는 것입니다.
여기에서는 opencv를 사용하여 카메라에서 비디오 스트림을 읽습니다.
인식을 위해 비디오 스트림의 각 프레임을 미디어파이프의 얼굴 인식 모델로 보냅니다.
사진 미디어파이프는 얼굴을 인식할 수 있을 뿐만 아니라 얼굴에 왼쪽 눈, 오른쪽 눈, 왼쪽 귀, 오른쪽 귀, 코, 입 등 6가지 주요 지점을 표시할 수 있습니다.
핵심 코드:
with self.mp_face_detection.FaceDetection( model_selection=0, min_detection_confidence=0.9) as face_detection: while cap.isOpened(): success, image = cap.read() image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = face_detection.process(image) image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) if results.detections: for detection in results.detections: # 获取人脸框坐标 face_box = detection.location_data.relative_bounding_box face_w, face_h = int(face_box.width * frame_w), int(face_box.height * frame_h) face_l = int(face_box.xmin * frame_w) + face_w face_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) # 显示人脸 6 个关键点 for point_name in FaceKeyPoint: 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) if point_name in pose_key_points else (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개 핵심 포인트의 좌표 거리를 통해 얼굴의 자세를 판단할 수 있습니다
여기서 왼쪽 귀와 코 사이의 수평 거리가 매우 가깝기 때문에 얼굴의 위치를 추정할 수 있습니다. 왼쪽으로 회전하므로 왼쪽으로 이동하려면 평면만 사용할 수 있습니다.
마찬가지로 다른 핵심 포인트를 사용하여 얼굴이 오른쪽으로 향하고 있는지, 위쪽으로(머리를 들 때), 아래쪽으로(머리를 낮추고 있는지) 추정할 수 있습니다.
핵심 코드:
# 左耳与鼻子水平距离,判断面部左转 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.y if left_ear_to_nose_dist < 0.07: # print('左转') 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] if nose_to_right_ear_dist < 0.07: # print('右转') self.key_board.press_key('D') time.sleep(0.07) self.key_board.release_key('D') return 'D', [FaceKeyPoint.NOSE_TIP, FaceKeyPoint.RIGHT_EAR_TRAGION]
인식 얼굴 자세, 프로그램을 사용하여 키보드를 제어하여 항공기의 움직임을 제어할 수 있습니다.
여기에서는 PyKeyboard 모듈을 사용하여 키보드 키를 제어합니다.
self.key_board = PyKeyboard() # print('左转') self.key_board.press_key('A') time.sleep(0.07) self.key_board.release_key('A')
press_key 및 release_key 함수는 각각 키 누름 및 릴리스 키입니다.
그 사이에는 버튼의 지속 시간을 제어하기 위해 time.sleep(0.07)이 호출됩니다. 버튼을 오랫동안 누르고 있으면 기체가 이동하는 거리가 길어집니다. 짧으면 기체가 이동하는 거리가 짧아집니다. 필요에 따라 조정할 수 있습니다.
위 내용은 얼굴 인식은 여전히 이렇게 작동할 수 있습니다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!