yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
Rider Pi Robot📖
0.Quick Start
  • 0. Notes (Must Read)new
  • 1.APP control experience
  • 2.Web page image transmission controlnew
  • 3.Manual
1.RPi Basic course
  • 1.SSH remote login
  • 2.VNC remote login desktop
  • 3. Remote file transfer
  • 4. JupyterLab environment construction and use
  • 5. Write system image
  • 6. Connect to WiFi
  • 7. Close startup programs(MustRead)
  • 8. Raspberry Pi system expansion
2.Car basic control course
  • 1. Car screen display control
  • 2. Car recording audio
  • 3. Car plays audio
  • 4. Car recording video
  • 5. Car plays video
  • 6. RGB light control
  • 7. Car attitude angle reading
  • 8. Read the battery level of the car
3.Car motion control
  • 1. Car forward and backward
  • 2. Car rotation movement
  • 3. Adjust car height
  • 4. Adjust car posture
  • 5. Car self-stabilization mode
  • 6. Car squats and shakes
4.Open Source CV
A. Getting started with OpenCV
  • 1. Introduction to OpenCV
  • 2. OpenCV image reading and display
  • 3. OpenCV image writing
  • 4. OpenCV Image Quality
  • 5.OpenCV pixel operations
B. OpenCV geometric transformation
  • 1. Image scaling
  • 2. Image cutting
  • 3. Image translation
  • 4. Image mirroring
  • 5. Affine Transformation
  • 6. Image Rotation
  • 7. Perspective Transformation
C. OpenCV image processing and drawing text segments
  • 1. Grayscale processing
  • 2. Image Binarization
  • 3. Edge Detection
  • 4. Line drawing
  • 5. Rectangle and circle drawing
  • 6. Text and picture drawing
D. Image beautification
  • 1. Color Image Histogram
  • 2. Histogram Equalization
  • 3. Image repair
  • 4. Brightness enhancement
  • 5. Skin whitening
  • 6. Gaussian mean filtering
  • 7. Median Filter
5.AI Visual recognition course
  • 1. Camera driver tutorial
  • 2. Color recognition
  • 3. HSV value test
  • 4. Object Recognition
  • 5. QR code recognition
  • 6. Human face mask
  • 7. License Plate Recognition
  • 8. Human Pose Estimation
  • 9. Object Detection
  • 10.Yolo detection
  • 11. Face Detection
  • 12. Face effects
  • 13. 3D Object Recognition
  • 14. Paintbrush
  • 15. Finger recognition
  • 16. Gesture Recognition
  • 17.Facial Recognitionnew
  • 18.Emotion Recognitionnew
  • 19.Motion Detectionnew
6.AI Visual interaction course
  • 1. Color tracking
  • 2. Color follows
  • 3. QR code recognition action
  • 4. Face tracking
  • 5. Finger control
  • 6. Gesture following
  • 7. Gesture control car
  • 8. Human Body Followingnew
7. AI Large Model Interaction
  • 0.Principles of Large AI Models
  • 1.Large model premise use configuration
  • 2.Q&A(For cm5)
  • 3.Q&A and ChatGPT(For cm4)
  • 4.Speech recognition
  • 5.Picture to Text
  • 6.Embodied intelligence
Download
  • APP(iOS/Android)
  • System_File
  • Code
  • Hareware_Info
  • AI_Model_File
  • 3D_Model_File
  • Instruction_Manual
Download ZIP

Welcome to Rider Pi Robot repository

6. Human face mask

Face Mask

1. Experimental Purpose

Drive the car to recognize the face and put a mask on the face, and make corresponding movements according to the position of the face on the screen

2. Experimental Path Source Code

Enter the car system, end the car program, enter "ip (ip is the car's ip): 8888" in the browser, enter the password "yahboom" image-2024112100001 Then log in Enter the path of Rider-pi_class/5.AI Visual Recognition Course/6. Facial Mask and run face_mask.ipynb. You can also enter commands in the terminal to directly start the python script

python3 face_mask.py

3. Experimental phenomenon

After running the source code, you can see that the car can recognize the face, put a mask on the face, and perform corresponding movements. image-2024112100002

4. Main source code analysis

​x
# For webcam input:
drawing_spec = mp_drawing.DrawingSpec(thickness=1, circle_radius=1)
cap=cv2.VideoCapture(0)
cap.set(3,320)
cap.set(4,240)
with mp_face_mesh.FaceMesh(
    max_num_faces=1,
    refine_landmarks=True,
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5) as face_mesh:
  while cap.isOpened():
    face_coordination_in_real_world = np.array([
        [285, 528, 200],
        [285, 371, 152],
        [197, 574, 128],
        [173, 425, 108],
        [360, 574, 128],
        [391, 425, 108]
    ], dtype=np.float64)
​
    h=240
    w=320 
    face_coordination_in_image = []
    text=''
    success, image = cap.read()
    if not success:
      print("Ignoring empty camera frame.")
      # If loading a video, use 'break' instead of 'continue'.
      continue
​
    # To improve performance, optionally mark the image as not writeable to
    # pass by reference.
    image.flags.writeable = False
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    results = face_mesh.process(image)
​
    # Draw the face mesh annotations on the image.
    image.flags.writeable = True
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
    direction=0
    if results.multi_face_landmarks:
      for face_landmarks in results.multi_face_landmarks:
        mp_drawing.draw_landmarks(
            image=image,
            landmark_list=face_landmarks,
            connections=mp_face_mesh.FACEMESH_TESSELATION,
            landmark_drawing_spec=None,
            connection_drawing_spec=mp_drawing_styles
            .get_default_face_mesh_tesselation_style())
        mp_drawing.draw_landmarks(
            image=image,
            landmark_list=face_landmarks,
            connections=mp_face_mesh.FACEMESH_CONTOURS,
            landmark_drawing_spec=None,
            connection_drawing_spec=mp_drawing_styles
            .get_default_face_mesh_contours_style())
        mp_drawing.draw_landmarks(
            image=image,
            landmark_list=face_landmarks,
            connections=mp_face_mesh.FACEMESH_IRISES,
            landmark_drawing_spec=None,
            connection_drawing_spec=mp_drawing_styles
            .get_default_face_mesh_iris_connections_style())
            
        for idx, lm in enumerate(face_landmarks.landmark):
          if idx in [1, 9, 57, 130, 287, 359]:
            x, y = int(lm.x * w), int(lm.y * h)
            face_coordination_in_image.append([x, y])
        face_coordination_in_image = np.array(face_coordination_in_image,dtype=np.float64)
        # The camera matrix
        focal_length = 1 * w
        cam_matrix = np.array([[focal_length, 0, w / 2],
                               [0, focal_length, h / 2],
                               [0, 0, 1]])
        # The Distance Matrix
        dist_matrix = np.zeros((4, 1), dtype=np.float64)
        success, rotation_vec, transition_vec = cv2.solvePnP(face_coordination_in_real_world, face_coordination_in_image,cam_matrix, dist_matrix)
        # Use Rodrigues function to convert rotation vector to matrix
        rotation_matrix, jacobian = cv2.Rodrigues(rotation_vec)
        result = rotation_matrix_to_angles(rotation_matrix)
        print(result)
        pitch=round(-result[0]/100*20)
        yaw=round(result[1]/80*15)
        roll=round(result[2]/80*15)
        if abs(yaw)<= 4:
            if abs(pitch)<3:
                pitch = round( pitch * 7 )
                print("pitch11",pitch)
                if pitch < -7:
                    print("hello")
                    pitch = -3
                    print("pitch",pitch)
                elif pitch > 7:
                    pitch = 3
                    print("picth",pitch)
            else:
                pitch = pitch
                print("pitch",pitch)
                yaw = 0
                roll = 0
        else:
            pitch = -3
            yaw = yaw 
            if abs(roll) >29:
                roll = round(roll/6)
            else:
                roll = roll
        print("pitch,yaw,roll",pitch,yaw,roll)
        if car_type!="R":
          car.attitude(['p','y','r'],[pitch,yaw,roll])
        else:
          print('rider')
          car.attitude(['p','y','r'],[pitch,yaw,roll])
          #car.attitude(['p','y','r'],[int(pitch/4),int(yaw/4),int(roll/4)])
        time.sleep(0.1)
    else:
      pass
    # Flip the image horizontally for a selfie-view mydisplay.
    b,g,r = cv2.split(image)
    image = cv2.merge((r,g,b))
    image = cv2.flip(image, 1)
    try:
      for i, info in enumerate(zip(('Pitch', 'Roll', 'Yaw'), result)):
        k, v = info
        text = f'{k}: {int(v)}'
        cv2.putText(image, text, (20, i*30 + 20),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (200, 0, 200), 2)
    except:
      pass
    imgok = Image.fromarray(image)
    mydisplay.ShowImage(imgok)
​
    #把结果显示到屏幕上
    r,g,b = cv2.split(image)
    image1 = cv2.merge((b,g,r))
    image_widget.value = bgr8_to_jpeg(image1)
    # cv2.imshow("image",image1)
​
    if cv2.waitKey(5) & 0xFF == 27:
      break
    if button.press_b():
      break
​
​

The main function turns on the camera and covers the face recognized by the camera with a mask, and performs corresponding movements based on the IMU data and the position of the face on the screen.

QR code recognition
License Plate Recognition

COMPANY

  • About us
  • Team Style
  • Blog

LEARNING & EXPLORATION

  • Tutorials
  • Edge AI hardware
  • Educational robots
  • Embedded intelligent hardware

WHERE TO BUY

  • Yahboom Online Store
  • Amazon
  • Alibaba
  • AliExpress
  • Mercado

TECHNOLOGY SUPPORT

  • Email: support@yahboom.com

BE A DISTRIBUTOR

  • Email: sales@yahboom.com
QR Code

Copyright © 2017-2026 Yahboom. All Rights Reserved.

EN/中文