7. 人脸跟踪 ====================== 在本项目中,PiDog 将安静地坐在原地。当你鼓掌时,它会转头看你,并在识别到你后和你打招呼。 .. raw:: html **运行代码** .. raw:: html .. code-block:: cd ~/pidog/examples sudo python3 7_face_track.py 代码运行后,PiDog 会启动摄像头并打开人脸检测功能。 你可以在浏览器中访问 ``http://+ PiDog's IP +/mjpg`` (例如: ``http://192.168.18.138:9000/mjpg`` )以查看摄像头画面。 接着,PiDog 将坐下并启用声音方向传感器模块来监听你的鼓掌方向。 当 PiDog 听到掌声(或其他响声)时,它会转头朝声源方向寻找你。 如果它检测到人脸(识别到目标),就会摇尾巴并发出汪汪叫声向你问好。 **代码** .. note:: 你可以对以下代码进行 **修改/重置/复制/运行/停止**。请确保进入源码路径(如 ``pidog\examples``)后进行操作。修改后可直接运行查看效果。 .. raw:: html .. code-block:: python #!/usr/bin/env python3 from pidog import Pidog from time import sleep from vilib import Vilib from preset_actions import bark my_dog = Pidog() sleep(0.1) def face_track(): Vilib.camera_start(vflip=False, hflip=False) Vilib.display(local=True, web=True) Vilib.human_detect_switch(True) sleep(0.2) print('start') yaw = 0 roll = 0 pitch = 0 flag = False direction = 0 my_dog.do_action('sit', speed=50) my_dog.head_move([[yaw, 0, pitch]], pitch_comp=-40, immediately=True, speed=80) my_dog.wait_all_done() sleep(0.5) # 清除伺服器动作造成的声音干扰 if my_dog.ears.isdetected(): direction = my_dog.ears.read() while True: if flag == False: my_dog.rgb_strip.set_mode('breath', 'pink', bps=1) # 如果检测到声音,则转向 if my_dog.ears.isdetected(): flag = False direction = my_dog.ears.read() pitch = 0 if direction > 0 and direction < 160: yaw = -direction if yaw < -80: yaw = -80 elif direction > 200 and direction < 360: yaw = 360 - direction if yaw > 80: yaw = 80 my_dog.head_move([[yaw, 0, pitch]], pitch_comp=-40, immediately=True, speed=80) my_dog.wait_head_done() sleep(0.05) ex = Vilib.detect_obj_parameter['human_x'] - 320 ey = Vilib.detect_obj_parameter['human_y'] - 240 people = Vilib.detect_obj_parameter['human_n'] # 如果识别到人脸,向其打招呼 if people > 0 and flag == False: flag = True my_dog.do_action('wag_tail', step_count=2, speed=100) bark(my_dog, [yaw, 0, 0], pitch_comp=-40, volume=80) if my_dog.ears.isdetected(): direction = my_dog.ears.read() if ex > 15 and yaw > -80: yaw -= 0.5 * int(ex/30.0+0.5) elif ex < -15 and yaw < 80: yaw += 0.5 * int(-ex/30.0+0.5) if ey > 25: pitch -= 1*int(ey/50+0.5) if pitch < - 30: pitch = -30 elif ey < -25: pitch += 1*int(-ey/50+0.5) if pitch > 30: pitch = 30 print('direction: %s |number: %s | ex, ey: %s, %s | yrp: %s, %s, %s ' % (direction, people, ex, ey, round(yaw, 2), round(roll, 2), round(pitch, 2)), end='\r', flush=True, ) my_dog.head_move([[yaw, 0, pitch]], pitch_comp=-40, immediately=True, speed=100) sleep(0.05) if __name__ == "__main__": try: face_track() except KeyboardInterrupt: pass except Exception as e: print(f"\033[31mERROR: {e}\033[m") finally: Vilib.camera_close() my_dog.close()