yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
DOFBOT-Ultra📖
1. Get Started Quickly
  • 0.Unboxing Video
  • 1. Get Started Quickly
  • 2. Access the Terminal
  • 3. Calibration offset(Depth Camera)
  • 4. Calibration offset(USB Camera)
2. Assembly Course
  • 1. Installation Steps
  • 2. Calibrate the Robotic Arm
  • 3. Install the Map
3. Remote Control Course
  • 1. Mobile Phone Control
  • 2. USB Handle Control
  • 3. PC Web Page Programming
4. Preparation
  • 1. Manage Web control services
  • 2. Manage JupyterLab services
  • 3. Manage OLED services
5. 2D Visual Tracking Course
  • 1. Color block positioning
  • 2. Color block tracking
  • 3. Face positioning
  • 4. Face tracking
  • 5. Label code positioning
  • 6. Label code tracking
6. 2D Visual Grasping Course
  • 1. Identify grab color block
  • 2. Catch game
  • 3. Color sorting
  • 4. Color stacking
  • 5. Label code sorting
  • 6. Label code stacking
  • 7. Gesture grasping color blocks
  • 8. Gesture stacking color blocks
  • 9. Single garbage sorting
  • 10. Garbage sorting
  • 11. Tracking game
7. 2D Mediapipe Course
  • 1. Hand detection
  • 2. Posture detection
  • 3. Overall detection
  • 4. Facial Detection
  • 5. Face Detection
  • 6. Face effects
  • 7. 3D Object Recognition
  • 8. Paintbrush
  • 9. Finger control
  • 10. Gesture Recognition
  • 11. Gesture control robotic arm action group
  • 12. Arm posture control robotic arm
  • 13. Palm Targeting
  • 14. Robotic arm tracks the palm
  • 15. Fingertip trajectory recognition
  • 16. Fingertip trajectory control robotic arm
  • 17. Gesture Grasp and Release Objects
  • 18. Finger Control Robot Arm
8. AI Large Model Voice Module (Must Read)
  • 1. Introduction to AI Large Model Voice Module
  • 2. Flash the firmware (Must read)
  • 3. Modify the wake-up word and command word
9. 2D Voice Control Course
  • 1. Simple Voice Control
  • 2. Smart Voice Control
  • 3. Voice Action Control
  • 4. Memory Learning Mode
  • 5. Color Recognition with Voice Broadcast
  • 6. Color Recognition and Grasping with Voice Broadcast
  • 7. Color Recognition and Sorting with Voice Broadcast
  • 8. Voice Recognition Target Tracking
  • 9. Voice Control Stacking
  • 10. Voice Control Sorting
  • 11. Garbage Recognition with Voice Broadcast
  • 12. Garbage Sorting with Voice Broadcast
10. 3D Depth Camera Course
  • 1. Dabai_DCW2 camera
  • 2. Deep pseudo-color image
  • 3. Depth camera ranging
  • 4. Color block volume measurement
11. 3D Robotic Arm Control and Inverse Kinematics
  • 1. Robotic arm ROS control
  • 2. Inverse solution
12. 3D Sorting and Grasping Course
  • 1. AprilTag ID sorting
  • 2. AprilTag abnormal height sorting
  • 3. MediaPipe Gesture-AprilTag ID sorting
  • 4. MediaPipe Gesture-AprilTag height sorting
  • 5. MediaPipe Gesture-AprilTag distance sorting
  • 6. Block color sorting
  • 7. Block abnormal height sorting
  • 8. Block different shape sorting
  • 9. Block shape abnormal height sorting
  • 10. Yolov26 garbage sorting
13. 3D Tracking and Grasping Course
  • 1. AprilTag Tracking and Grasping
  • 2. Color Block Tracking and Grasping
  • 3. KCF Object Tracking and Grasping
14. 3D Voice Control for Grasping Course (Sorting & Tracking)
  • 1. Voice Control AprilTag ID Sorting
  • 2. Voice Control Remove Height Abnormal AprilTag
  • 3. Voice Control Tracking and Grasping AprilTag
  • 4. Voice Control Color Block Sorting
  • 5. Voice Control Remove Height Abnormal Color Block
  • 6. Voice Control Tracking and Grasping Color Block
  • 7. Voice Control Yolov26 Garbage Recognition Sorting
  • 8. Voice Control Object Tracking and Grasping
15. AI Model Basics
  • 1. AI Large Model Types and Principles
  • 2. RAG Retrieval Enhancement and Model Training Samples
  • 3. Embodied Intelligent Robot System Architecture
  • 4. Embodied Intelligent Functions Core Source Code
16. AI Model Development
  • 0. DofbotUltra Large Model Development Quick Start Guide
  • 1. Register a Model Service Provider Account
  • 2. Configure API-KEY
  • 3. Introduction to Dify
  • 4. Basic Dify Features
  • 5. AI Large Model Development - chatbot
  • 6. Deploy the RAG knowledge base
  • 7. RAG knowledge base + chatbot
  • 8. AI agent workflow
17. AI Model – Text Version
  • 1. Semantic understand instruction following
  • 2. Multimodal visual understand
  • 3. Text Large Model + robotic arm control
  • 4. Multimodal Large Model + Video Understanding
  • 5. Multimodal Large Model + Robotic Arm Gripping
  • 6. Multimodal Large Model + Robotic Arm Tracking
  • 7. Multimodal Large Model + Robotic Arm Sorting
  • 8. Multimodal Large Model + Robotic Arm Handling
  • 9. Multimodal Large Model + Color Blocks Back In Place
  • 10. Multimodal Large Model + Intent Prediction + Robotic Arm Gripping
  • 11. Text Large Model + YOLOv26 + Intelligent Garbage Classification
18. AI Model – Voice Version
  • 1. Semantic understand instruction following
  • 2. Multimodal visual understand
  • 3. Text Large Model + robotic arm control
  • 4. Multimodal Large Model + Video Understanding
  • 5. Multimodal Large Model + Robotic Arm Gripping
  • 6. Multimodal Large Model + Robotic Arm Tracking
  • 7. Multimodal Large Model + Robotic Arm Sorting
  • 8. Multimodal Large Model + Robotic Arm Handling
  • 9. Multimodal Large Model + Color Blocks Back In Place
  • 10. Multimodal Large Model + Intent Prediction + Robotic Arm Gripping
  • 11. Text Large Model + YOLOv26 + Intelligent Garbage Classification
19. AI Model – Fun Applications
  • 1. AI Butler-Intent Inference
  • 2. AI Encyclopedia-Arithmetic Master
  • 3. AI Encyclopedia-You asked I Pointed
  • 4. AI Encyclopedia-Nutritional Analysis
  • 5. AI Encyclopedia-Problem Solving Expert
  • 6. AI Encyclopedia-English Spelling
  • 7. AI Butler-Garbage Sorting
  • 8. AI Top Chef
20. MoveIt Course
  • 1. MoveIt Configuration
  • 2. MoveIt Usage
  • 3. MoveIt Drive Real Robot
  • 4. MoveIt Random Movement
  • 5. MoveIt Forward Kinematics Design
  • 6. MoveIt Inverse Kinematics Design
  • 7. MoveIt Cartesian Path
  • 8. MoveIt Scene Design
  • 9. MoveIt Trajectory Planning
  • 10. MoveIt Collision Detection
21. YOLOv11 Development Course
PI 5
  • 1. YOLO Environment Setup
  • 2. CLI Usage
  • 3. Object Detection
  • 4. Instance Segmentation
  • 5. Pose Estimation
  • 6. Image Classification
  • 7. Oriented Bounding Boxes Object Detection
  • 8. Model Conversion
  • 9. Dataset Annotation
  • 10. Model Training and Conversion
  • 11. Model Prediction
RDK X5
  • 1. YOLO Environment Setup
  • 2. CLI Usage
  • 3. Object Detection
  • 4. Instance Segmentation
  • 5. Pose Estimation
  • 6. Image Classification
  • 7. Oriented Bounding Boxes Object Detection
  • 8. Model Prediction
  • 9. Model Conversion
22. YOLOv26 Development Course
PI 5
  • 6. Image Classification
  • 1. YOLO Environment Setup
  • 2. CLI Usage
  • 3. Object Detection
  • 4. Instance Segmentation
  • 5. Pose Estimation
  • 6. Image Classification
  • 7. Oriented Bounding Boxes Object Detection
  • 8. Model Conversion
  • 9. Dataset Annotation
  • 10. Model Training and Conversion
  • 11. Model Prediction
RDK X5
  • 1. YOLO Environment Setup
  • 2. CLI Usage
  • 3. Object Detection
  • 4. Instance Segmentation
  • 5. Pose Estimation
  • 7. Oriented Bounding Boxes Object Detection
  • 8. Model Conversion
  • 9. Dataset Annotation
  • 10. Model Training and Conversion
  • 11. Model Prediction
23.Linux Operating System
  • 1.Introduction to Linux system
  • 2.Ubuntu file system
  • 3.Ubuntu common commands
  • 4.Ubuntu common editors
  • 5.Ubuntu software operation commands
  • 6.Virtual machine installation
  • 7.SSH remote control
  • 8.VNC remote control
  • 9.Transfer files remotely
  • 10.Driver library and communication
  • 11.Capacity expansion and resource allocation
  • 12.Bind device ID
  • 13.Capacity expansion and resource allocation
  • 14.Update system software sources
  • 15.Set root user password
  • 16.sudo free password
  • 17.Connect to WiFi network
  • 18.View system version
  • 19.Customized service management
  • 20.Back up system image
24. Basic Control Course
  • 1. Control RGB Light
  • 2. Control Buzzer
  • 3. Control Single Servo
  • 4. Read Servo Angle
  • 5. Control All Servos
  • 6. DOFBOT Up Down Left Right Movement
  • 7. DOFBOT Dancing
  • 8. DOFBOT Memory Actions
  • 9. DOFBOT Grab Blocks
  • 10. Porter
  • 11. Stack Blocks
  • 12. Two DOFBOT Synchronized Actions
25.RDKx5 Board Basic Course
  • 1.Introduction to RDK X5 board
  • 2.Write system file
  • 3.Hardware interface description
  • 4.Install case and other accessories
  • 5.Use 7-inch display
  • 6.SD card expansion
  • 7.Network configuration
  • 8.Remote login
  • 9.Update system
  • 10.srpi-config user guide
  • 11.config. txt configuration file
  • 12.Self-startup setting
  • 13.RDK exclusive command usage
  • 14.Linux command usage
  • 15.GPIO readwrite operation
  • 16.Image classification algorithm
  • 17.Use USB camera
  • 18.Use MIPI camera
  • 19.Binocular camera depth algorithm
26.PI5 Board Basic Course
  • 1.Introduction to Raspberry PI 5
  • 2.Raspberry PI system installation and backup
  • 3.Powering the Raspberry PI 5
  • 4.Startup of Raspberry PI 5
  • 5.Installation and introduction of shell and active radiator
  • 6.GPIO and 40-pin pins
  • 7.Tips for using Raspberry PI 5
  • 8.Raspberry PI PCIe connector
  • 9.MIPI CSI DSI connector
  • 10.UART connector
  • 11.Real-time clock
  • 12.Power over Ethernet (PoE) connector
  • 13.Update and upgrade operating system
  • 14.Introduction to raspi-config tool
  • 15.config.txt file description
  • 16.Network Configuration
  • 17.remote access
  • 18.Transfer files remotely
  • 19.Set display resolution and rotation
  • 20.Set screen to sleep
  • 21.Get real-time temperature of Raspberry Pi
  • 22.Play audio and video
  • 23.Using USB camera
  • 24.Using MIPI camera
27. Visual Basics Course
  • 1. Introduction to Open Source CV
  • 2. Image Reading and Display
  • 3. Image Writing
  • 4. Image Quality
  • 5. Pixel Operation
  • 6. Image Zoom
  • 7. Picture Cut
  • 8. Picture Pan
  • 9. Picture Mirroring
  • 10. Affine Transformation
  • 11. Picture Rotation
  • 12. Perspective Transformation
  • 13. Grayscale Processing
  • 14. Binary Image
  • 15. Edge Detection
  • 16. Line Segment Drawing
  • 17. Rectangular Circle Drawing
  • 18. Text and Picture Drawing
28. ROS2 Basic Course
  • 1.Introduction to ROS2
  • 2.ROS2 install Humble
  • 3.ROS2 development environment
  • 4.ROS2 workspace
  • 5.ROS2 function package
  • 6.ROS2 node
  • 7.ROS2 topic communication
  • 8.ROS2 service communication
  • 9.ROS2 action communication
  • 10.ROS2 custom interface message
  • 11.ROS2 parameter service case
  • 12.ROS2 meta-function package
  • 13.ROS2 distributed communication
  • 14.ROS2 DDS
  • 15.ROS2 time related API
  • 16.ROS2 common command tools
  • 17.ROS2 rviz2 use
  • 18.ROS2 rqt toolbox
  • 19.ROS2 Launch startup file configuration
  • 20.ROS2 recording and playback tool
  • 21.ROS2 URDF model
  • 22.ROS2 Gazebo simulation platform
  • 23.ROS2 TF2 coordinate transformation
29. Jupyter Lab Usage Course
  • 1. Read the document before operation
  • 2. Jupyter lab environment construction tutorial
  • 3. Basic tutorial of Jupyter lab
  • 4. Jupyter widgets configuration tutorial
  • 5. Getting Started Tutorial for JupyterWidgets Controls
Download
  • System_File
  • VM_File
  • Instruction Manual
  • Code
  • Software Tools
  • Communication_Protocols
  • Hardware_Info
Download ZIP

Welcome to DOFBOT-Ultra repository

8. Paintbrush

Paintbrush

Please ensure that the web control program backend process is not running in the background. To close it, refer to the [Get Started Quickly - 2. Access the Terminal] section in [Disable the Auto-Start Web Control Backend Process]. After closing, please restart DofbotUltra!!!

Use finger gestures to perform virtual painting on the camera feed. Supports multiple colors and an eraser function.

1、Operation Instructions

1.1、Gesture Description

GestureHand ShapeFunction
Index + Middle finger extended"Peace sign"Selection mode: Move to the color blocks at the top of the screen to switch brush color
Only index finger extended"Number 1"Drawing mode: The index finger movement trajectory becomes the brush stroke
Other gestures—Stop drawing (pen up)

1.2、Available Colors

There are 5 color blocks at the top of the screen. In selection mode, move your finger to the corresponding area to switch:

Area (left to right)ColorDescription
Area 1RedDefault color
Area 2Green—
Area 3Blue—
Area 4Yellow—
Area 5BlackEraser (thick line coverage)

1.3、Startup

  • Enter the following command to start the program

xxxxxxxxxx
ros2 run dofbot_mediapipe 08_VirtualPaint.py

image-20231016112807709

Press the q key in the image window or Ctrl+C in the terminal to exit the program.

1.4、Source Code

Raspberry Pi source path:

xxxxxxxxxx
~/dofbot_ultra_ws/src/dofbot_mediapipe/scripts/08_VirtualPaint.py

RDK X5 source path:

xxxxxxxxxx
~/dofbot_ultra_ws/src/2d/dofbot_mediapipe/scripts/08_VirtualPaint.py
#!/usr/bin/env python3
# encoding: utf-8
import math
import cv2 as cv
import numpy as np
import mediapipe as mp
from dofbot_utils.camera import create_camera
from dofbot_utils.fps import FPS


class HandDetector:
    def __init__(self, mode=False, maxHands=2, detectorCon=0.5, trackCon=0.5):
        self.tipIds = [4, 8, 12, 16, 20]
        self.mpHand = mp.solutions.hands
        self.mpDraw = mp.solutions.drawing_utils
        self.hands = self.mpHand.Hands(
            static_image_mode=mode,
            max_num_hands=maxHands,
            min_detection_confidence=detectorCon,
            min_tracking_confidence=trackCon)
        self.lmDrawSpec = mp.solutions.drawing_utils.DrawingSpec(
            color=(0, 0, 255), thickness=-1, circle_radius=15)
        self.drawSpec = mp.solutions.drawing_utils.DrawingSpec(
            color=(0, 255, 0), thickness=10, circle_radius=10)
        self.lmList = []

    def findHands(self, frame, draw=True):
        self.lmList = []
        img_RGB = cv.cvtColor(frame, cv.COLOR_BGR2RGB)
        self.results = self.hands.process(img_RGB)
        if self.results.multi_hand_landmarks:
            for handLms in self.results.multi_hand_landmarks:
                if draw:
                    self.mpDraw.draw_landmarks(
                        frame, handLms, self.mpHand.HAND_CONNECTIONS,
                        self.lmDrawSpec, self.drawSpec)
            for id, lm in enumerate(
                    self.results.multi_hand_landmarks[0].landmark):
                h, w, c = frame.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                self.lmList.append([id, cx, cy])
        return frame, self.lmList

    def _get_dist(self, p1, p2):
        return math.sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2)

    def _calc_angle(self, pt1, pt2, pt3):
        p1 = (self.lmList[pt1][1], self.lmList[pt1][2])
        p2 = (self.lmList[pt2][1], self.lmList[pt2][2])
        p3 = (self.lmList[pt3][1], self.lmList[pt3][2])
        a = self._get_dist(p1, p2)
        b = self._get_dist(p2, p3)
        c = self._get_dist(p1, p3)
        try:
            radian = math.acos((a**2 + b**2 - c**2) / (2 * a * b))
            return abs(radian / math.pi * 180)
        except (ValueError, ZeroDivisionError):
            return 0

    def fingersUp(self):
        fingers = []
        a1 = self._calc_angle(self.tipIds[0], self.tipIds[0] - 1,
                               self.tipIds[0] - 2)
        a2 = self._calc_angle(self.tipIds[0] - 1, self.tipIds[0] - 2,
                               self.tipIds[0] - 3)
        fingers.append(1 if a1 > 150.0 and a2 > 150.0 else 0)
        for id in range(1, 5):
            if self.lmList[self.tipIds[id]][2] < \
                    self.lmList[self.tipIds[id] - 2][2]:
                fingers.append(1)
            else:
                fingers.append(0)
        return fingers


def main():
    hand_detector = HandDetector(detectorCon=0.85)
    fps_counter = FPS()
    xp = yp = 0
    boxx = 0
    imgCanvas = np.zeros((480, 640, 3), np.uint8)
    brushThickness = 5
    eraserThickness = 100
    top_height = 50
    Color = "Red"
    ColorList = {
        'Red': (0, 0, 255), 'Green': (0, 255, 0),
        'Blue': (255, 0, 0), 'Yellow': (0, 255, 255),
        'Black': (0, 0, 0),
    }

    cap = create_camera()
    if not cap.isOpened():
        raise RuntimeError("Failed to open camera")

    try:
        while cap.isOpened():
            ret, frame = cap.read()
            if not ret:
                continue

            h, w, c = frame.shape
            frame, lmList = hand_detector.findHands(frame, draw=False)
            if len(lmList) != 0:
                x1, y1 = lmList[8][1:]
                x2, y2 = lmList[12][1:]
                fingers = hand_detector.fingersUp()
                if fingers[1] and fingers[2]:
                    if y1 < top_height:
                        if 0 < x1 < int(w / 5) - 1:
                            boxx = 0; Color = "Red"
                        elif int(w / 5) < x1 < int(w * 2 / 5) - 1:
                            boxx = int(w / 5); Color = "Green"
                        elif int(w * 2 / 5) < x1 < int(w * 3 / 5) - 1:
                            boxx = int(w * 2 / 5); Color = "Blue"
                        elif int(w * 3 / 5) < x1 < int(w * 4 / 5) - 1:
                            boxx = int(w * 3 / 5); Color = "Yellow"
                        elif int(w * 4 / 5) < x1 < w - 1:
                            boxx = int(w * 4 / 5); Color = "Black"
                    cv.rectangle(frame, (x1, y1 - 25), (x2, y2 + 25),
                                 ColorList[Color], cv.FILLED)
                    cv.rectangle(frame, (boxx, 0),
                                 (boxx + int(w / 5), top_height),
                                 ColorList[Color], cv.FILLED)
                    bw = int(w / 5)
                    for i, c_name in enumerate(ColorList):
                        cv.rectangle(frame, (i * bw + (2 if i > 0 else 0), 0),
                                     ((i + 1) * bw - 1, top_height),
                                     ColorList[c_name], 3)
                    xp = yp = 0
                elif (fingers[1] and not fingers[2] and
                      math.hypot(x2 - x1, y2 - y1) > 50):
                    if xp == 0 and yp == 0:
                        xp, yp = x1, y1
                    thickness = (eraserThickness if Color == 'Black'
                                 else brushThickness)
                    cv.line(frame, (xp, yp), (x1, y1),
                            ColorList[Color], thickness)
                    cv.line(imgCanvas, (xp, yp), (x1, y1),
                            ColorList[Color], thickness)
                    cv.circle(frame, (x1, y1), 15, ColorList[Color],
                              cv.FILLED)
                    xp, yp = x1, y1
                else:
                    xp = yp = 0

            imgGray = cv.cvtColor(imgCanvas, cv.COLOR_BGR2GRAY)
            _, imgInv = cv.threshold(imgGray, 50, 255, cv.THRESH_BINARY_INV)
            imgInv = cv.cvtColor(imgInv, cv.COLOR_GRAY2BGR)
            frame = cv.bitwise_and(frame, imgInv)
            frame = cv.bitwise_or(frame, imgCanvas)

            fps_counter.update_fps()
            h_f = frame.shape[0]
            cv.rectangle(frame, (20, h_f - 100), (50, h_f - 70),
                         ColorList[Color], cv.FILLED)
            cv.putText(frame, Color, (70, h_f - 75),
                       cv.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 1)
            fps_counter.show_fps(frame)
            cv.imshow('VirtualPaint', frame)

            if cv.waitKey(1) & 0xFF == ord('q'):
                break
    finally:
        cap.release()
        cv.destroyAllWindows()


if __name__ == '__main__':
    main()
3D Object Recognition
Finger control

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/中文