Heim  >  Artikel  >  Technologie-Peripheriegeräte  >  Die Gesichtserkennung kann trotzdem so funktionieren

Die Gesichtserkennung kann trotzdem so funktionieren

PHPz
PHPznach vorne
2023-05-11 12:34:051016Durchsuche

Heute werden wir es erweitern und Flugzeugschlachten mit menschlichen Gesichtern spielen. Obwohl die Idee der Gestenerkennung ähnelt, ist die Codemenge etwas größer als bei der Gestenerkennungsversion.

Der verwendete Gesichtsalgorithmus ist auf Millisekundenebene, die Bildrate kann 30 erreichen und er läuft sehr reibungslos auf einer Computer-CPU.

Jetzt werde ich den Projektimplementierungsprozess teilen und am Ende des Artikels den vollständigen Quellcode des Projekts erhalten.

Vorbereiten des Plane War-Programms

Suchen Sie eine Python-Version des Plane War-Programms auf Github, installieren Sie Pygame und führen Sie es aus.

Die Gesichtserkennung kann trotzdem so funktionieren

Verwenden Sie die Tasten A, D, W und S auf der Tastatur, um die Bewegungsrichtung des Flugzeugs zu steuern, die links, rechts, nach oben bzw. nach unten.

Als nächstes müssen wir das Gesicht erkennen, die Gesichtshaltung schätzen und die geschätzten Ergebnisse nach links, rechts, oben und unten abbilden, um den Betrieb des Flugzeugs zu steuern.

Gesichtserkennung

Hier verwenden wir opencv, um den Videostream von der Kamera zu lesen.

Senden Sie jedes Bild im Videostream zur Erkennung an das Gesichtserkennungsmodell in Mediapipe.

Die Gesichtserkennung kann trotzdem so funktionieren

Picture Mediapipe kann nicht nur Gesichter erkennen, sondern auch 6 Schlüsselpunkte im Gesicht markieren: linkes Auge, rechtes Auge, linkes Ohr, rechtes Ohr, Nase, Mund.

Kerncode:

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)

Es gibt einen kleinen Wissenspunkt, auf den jeder achten muss.

Der Code verwendet draw_zh_img, um Chinesisch anzuzeigen, da opencv die direkte Anzeige von Chinesisch nicht unterstützt. Daher verwende ich die Image-Methode im PIL-Modul, um chinesische Bilder im Voraus zu zeichnen und sie in das OpenCV-Format zu konvertieren.

Die Gesichtserkennung kann trotzdem so funktionieren

Bei Bedarf direkt mit dem Videostream zusammenführen, mit hoher Effizienz und ohne Frame-Drop.

Gesichtshaltungsschätzung

Zuvor haben wir für die Gestenerkennung benachbarte Frames verwendet, um die Bewegung der Geste zu bestimmen. Die Schätzung der Gesichtshaltung verwendet nur den aktuellen Frame, was relativ einfach ist.

Wir können die Haltung des Gesichts durch den Koordinatenabstand der 6 Schlüsselpunkte des Gesichts bestimmen

Die Gesichtserkennung kann trotzdem so funktionieren

Hier Der horizontale Abstand zwischen dem linken Ohr und der Nase ist sehr gering, sodass wir davon ausgehen können, dass sich das Gesicht nach links dreht und somit die Ebene nach links bewegt werden kann.

In ähnlicher Weise können wir anhand anderer Schlüsselpunkte abschätzen, wie sich das Gesicht nach rechts, nach oben (nach oben schauend) und nach unten (nach unten schauend) dreht.

Kerncode: #🎜🎜 #

# 左耳与鼻子水平距离,判断面部左转
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]

Lagesteuerung der Flugzeugbewegung

Nachdem wir die Gesichtshaltung erkannt haben, können wir das Programm verwenden, um die Tastatur zu steuern, um die Bewegung des Flugzeugs zu steuern.

Hier verwende ich das PyKeyboard-Modul zur Steuerung der Tastaturtasten.

self.key_board = PyKeyboard()
# print('左转')
self.key_board.press_key('A')
time.sleep(0.07)
self.key_board.release_key('A')

Die Funktionen „Press_Key“ und „Release_Key“ sind Tastendruck bzw. Freigabetaste.

Dazwischen wird time.sleep(0.07) aufgerufen, um die Dauer der Taste zu steuern. Wenn die Taste lange gedrückt wird, ist die Entfernung, über die sich das Flugzeug bewegt, lang. Wenn die Taste kurz gedrückt wird, verkürzt sich die Distanz, die das Flugzeug zurücklegt. Jeder kann es an seine eigenen Bedürfnisse anpassen.

Das obige ist der detaillierte Inhalt vonDie Gesichtserkennung kann trotzdem so funktionieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen