今日はそれを拡張して、人間の顔をした飛行機の戦いをプレイします。考え方はジェスチャー認識と似ていますが、コードの量はジェスチャー認識バージョンよりわずかに多くなります。
使用される顔アルゴリズムはミリ秒レベルで、フレーム レートは 30 に達し、コンピューターの CPU 上で非常にスムーズに動作します。
以下ではプロジェクトの実装プロセスを共有し、記事の最後でプロジェクトの完全なソース コードを入手します。
Plane War プログラムの Python バージョンを Github で見つけ、Pygame をインストールして実行します。
キーボードの A、D、W、S キーを使用して、航空機の移動方向を制御します。それぞれ左、右、上、下に対応します。 。
したがって、次にしなければならないことは、顔を認識し、顔の姿勢を推定し、推定結果を左右上下にマッピングして航空機の動作を制御することです。
ここでは、opencv を使用してカメラからビデオ ストリームを読み取ります。
ビデオ ストリームの各フレームをメディアパイプの顔認識モデルに送信して認識します。
Picture mediapipe は顔を認識するだけでなく、顔の 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)
誰もが注意する必要がある小さな知識点があります。 opencv は中国語の直接表示をサポートしていないため、
draw_zh_img は中国語を表示するコードで使用されます。そこで、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 中国語 Web サイトの他の関連記事を参照してください。