Rumah  >  Artikel  >  Peranti teknologi  >  Pengecaman muka masih boleh berfungsi seperti ini

Pengecaman muka masih boleh berfungsi seperti ini

PHPz
PHPzke hadapan
2023-05-11 12:34:051013semak imbas

Hari ini kami akan mengembangkannya dan memainkan pertempuran kapal terbang dengan wajah manusia. Walaupun idea itu serupa dengan pengecaman gerak isyarat, jumlah kod adalah lebih sedikit daripada versi pengecaman gerak isyarat.

Algoritma muka yang digunakan adalah tahap milisaat, kadar bingkai boleh mencapai 30, dan ia berjalan dengan lancar pada CPU komputer.

Saya akan berkongsi proses pelaksanaan projek di bawah, dan mendapatkan kod sumber lengkap projek di penghujung artikel.

Sediakan program perang pesawat

Cari versi Python program perang pesawat di Github, pasang Pygame dan jalankan.

Pengecaman muka masih boleh berfungsi seperti ini

Gunakan kekunci A, D, W dan S pada papan kekunci untuk mengawal arah pergerakan pesawat, masing-masing sepadan dengan kiri, kanan, atas dan bawah.

Jadi, apa yang perlu kita lakukan seterusnya ialah mengenali wajah, menganggarkan pose muka, dan memetakan hasil anggaran ke kiri, kanan, atas dan bawah untuk mengawal operasi pesawat.

Pengecaman muka

Di sini, kami menggunakan opencv untuk membaca strim video daripada kamera.

Hantar setiap bingkai dalam strim video ke model pengecaman muka dalam mediapipe untuk pengecaman.

Pengecaman muka masih boleh berfungsi seperti ini

Pipa media gambar bukan sahaja boleh mengecam muka, tetapi juga menandakan 6 perkara utama pada muka: mata kiri, mata kanan, telinga kiri, telinga kanan, hidung dan mulut.

Kod teras:

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)

Ada sedikit ilmu yang perlu diberi perhatian oleh semua orang.

Draw_zh_img digunakan dalam kod untuk memaparkan bahasa Cina, kerana opencv tidak menyokong paparan langsung bahasa Cina. Oleh itu, saya menggunakan kaedah Imej dalam modul PIL untuk melukis gambar Cina terlebih dahulu dan menukarnya kepada format opencv.

Pengecaman muka masih boleh berfungsi seperti ini

Apabila diperlukan, gabungkan terus dengan strim video, dengan kecekapan tinggi dan tiada bingkai jatuh.

Anggaran pose muka

Sebelum pengecaman gerak isyarat, kami menggunakan bingkai bersebelahan untuk menilai pergerakan gerak isyarat. Anggaran pose muka hanya menggunakan bingkai semasa, yang agak mudah.

Kita boleh menentukan postur muka melalui jarak koordinat 6 titik utama muka

Pengecaman muka masih boleh berfungsi seperti ini

Di sini, jarak mendatar antara telinga kiri dan hidung Sangat rapat, oleh itu, kita boleh menganggarkan muka untuk membelok ke kiri dan dengan itu boleh menggerakkan pesawat ke kiri.

Begitu juga, dengan menggunakan perkara penting lain, kita boleh menganggarkan muka menoleh ke kanan, ke atas (menoleh ke atas) dan ke bawah (menoleh ke bawah)

Kod teras:

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

Kawalan sikap pergerakan pesawat

Selepas mengenali postur muka, kita boleh menggunakan program untuk mengawal papan kekunci untuk mengawal pergerakan pesawat.

Di sini saya menggunakan modul PyKeyboard untuk mengawal kekunci papan kekunci.

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

Fungsi press_key dan release_key masing-masing ialah kekunci tekan dan pelepas.

Di antara mereka, time.sleep(0.07) dipanggil untuk mengawal tempoh butang Jika butang ditekan untuk masa yang lama, jarak pesawat akan bergerak jauh Sebaliknya, jika masa butang adalah pendek, jarak pesawat akan bergerak akan menjadi pendek Anda boleh mengikut Laraskan kepada keperluan anda sendiri.

Atas ialah kandungan terperinci Pengecaman muka masih boleh berfungsi seperti ini. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam