yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
ROSMASTER R2📖
1.Preparation and First Trial
  • 1.1 Accessories introduction
  • 1.2 Precautions for battery
  • 1.3 First Trial
2.Assembly steps
  • Installaction Video
3.ROS1-Remote control course
  • 3.1 APP remote control
  • 3.2 Model aircraft remote control
  • 3.3 Handle remote control
4.ROS1-Hardware course
  • 4.1 About expansion board_V3.0
  • 4.1 About expansion board_V1.0
  • 4.2 STM32 Development environment
  • 4.3 Button to control the buzzer to whistle
  • 4.4 FreeRTOS application
  • 4.5 Serial communication
  • 4.6 SBUS model aircraft remote control
  • 4.7 CAN bus communication
  • 4.8 RGB colorful light bar
  • 4.9 Timer interrupt to control PWM servo
  • 4.10 Control serial port servos
  • 4.11 Nine-axis attitude sensor to obtain data
  • 4.12 Control motor
  • 4.13 Timer captures the encoder data
  • 4.14.1 Kinematic Analysis of Mecanum Wheel
  • 4.14.2 Kinematics Analysis of Ackermann Car
  • 4.15 PID control robot movement
5.ROS1-Basic course
  • 5.1 Update the firmware
  • 5.2 Turn off the self-starting process at startup
  • 5.3 Install the Rosmaster driver library
  • 5.4 Buzzer whistle
  • 5.5 Control PWM servo
  • 5.6 RGB colorful light bar special effects display
  • 5.7 Control motor
  • 5.8 Control robot movement
  • 5.9 Control Serial Servo
6.ROS1-Linux operating system
  • 6.1 Virtual machine installation and use
  • 6.2 Linux basics
  • 6.3 Remote control
  • 6.4 Multi-machine communication configuration
  • 6.5 Static IP and hotspot mode
  • 6.6 Bind the device ID
  • 6.7 Web page real-time monitoring
  • 6.8 Expansion tutorial
  • 6.9.1 Jetson Nano write sytem
  • 6.9.2 Jetson Xavier NX write system
  • 6.9.3 Jetson TX2 NX write system
  • 6.9.4 Raspberry Pi write system
7.ROS1-Docker-pi5
  • 1、Docker overview and docker installation
  • 2、Common commands for docker image containers
  • 3、Docker images deeply understand and publish images
  • 4、Docker hardware interaction and data processing
  • 5、Enter the bot's docker container
  • 6、Robot development environment construction in Docker
  • 7、How customers can update docker images in the future
8.ROS1-ROS basic course
  • 1.ROS introduction
  • 2.ROS installation
  • 3.ROS common command tools
  • 4.ROS workspace
  • 5.ROS function package
  • 6.ROS node
  • 7.ROS topic publisher
  • 8.ROS topic subscribers
  • 9.ROS service client
  • 10.ROS service server
  • 11.ROS action client
  • 12.ROS action server
  • 13.ROS custom message reception
  • 14.ROS-launch file
  • 15.ROS-TF transformation
  • 16.ROS parameter service
  • 17.ROS-rviz use
  • 18.ROS-rqt tool usage
  • 19.Topic message recording and playback
  • 20.urdf model introduction
  • 21.gazebo introduction
  • 22.ROS distributed communication
9.ROS1-OpenCV courses
  • 9.1 Getting started with Open Source CV
  • 9.2 Geometric transformation
  • 9.3 Image processing and drawing text line segments
  • 9.4 Image beautification
  • 9.5 Opencv application
  • 9.6 AR vision
  • 9.7 AR QR code
  • 9.8 ROS+Opencv foundation
  • 9.9 ROS+Opencv application
  • 9.10 Data transformation and point cloud
  • 9.11 MediaPipe development
10.ROS1-Robot control course
  • 10.1 PID algorithm theory
  • 10.2 Robot PID debugging
  • 10.3 Robot information release
  • 10.4 Robot keyboard control
  • 10.5 Robot handle control
  • 10.6 Robot state estimation
  • 10.7 Robot calibration
  • 10.8 Robot URDF model
11.ROS1-Depth camera course
  • 11.1 How to use the Astra camera
  • 11.2 Astra camera calibration
  • 11.3 Astra Color Tracking
  • 11.4 Astra Object Tracking
  • 11.5 Visual tracking autopilot
  • 11.6 Pure visual 2D mapping and navigation
  • 11.7 RTAB-Map 3D mapping navigation
  • 11.8 ORB_SLAM2 basics
  • 11.9 ORB_SLAM2_Octomap
12.ROS1-Lidar course
  • 11.1 Lidar basic-SLAM
  • 11.1 Lidar basic-EAI
  • 11.2 Lidar avoiding
  • 11.3 Lidar guard
  • 11.4 Lidar follow
  • 11.5 Patrol game
  • 11.6 gmapping mapping
  • 11.7 hector mapping
  • 11.8 karto mapping
  • 11.9 cartographer mapping
  • 11.10 rrt_exploration mappin
  • 11.11 AMCL
  • 11.12 Navigation and avoiding
  • 11.13 APP mapping and navigation
  • 11.14 TEB path planning algorithm
13.ROS1-Multi-robot control course
  • 13.1 Multi-machine handle control
  • 13.2 Multi-machine navigation
  • 13.3 Multi-machine formation
  • 13.4 Multi-machine surround
14.ROS1-Deep learning courses
  • 14.1 KNN recognizes handwritten digits
  • 14.2 Basic use of TensorFlow
  • 14.3 Basic use of PyTorch(jetson)
  • 14.4 yolov5 model training(jetson)
  • 14.5 yolov5+tensorrt acceleration(jetson)
  • 14.6 yolov4-tiny
15.ROS1-Voice control courses
  • 15.0 How to use old voice module in new image
  • 15.1 Introduction of voice control module-NEW
  • 15.2 Voice control module port binding-NEW
  • 15.1 Introduction of voice control module-Old
  • 15.2 Voice control module port binding-Old
  • 15.3 Voice control car movement
  • 15.4 Voice control Autopilot
  • 14.5 Voice control color recognition
  • 15.6 Voice control color tracking
  • 15.7 Voice control multi-point navigation
16.ROS1-Model training Autopilot
  • 16.0 ReadMe
  • 16.1 yolov5 to train traffic signs
  • 16.2 TensorRt acceleration identification mark
  • 16.3 Road sign indication function description
  • 16.4 Collect data
  • 16.5 Training model
  • 16.6 Model transformation and application
  • 16.7 AI Autopilot
17. ROS2-Remote control course
  • 1. APP remote control
  • 2. Model aircraft remote control
  • 3. Handle remote control
18.ROS2-Hardware course
  • 1. Expansion board introduction_V3.0
  • 1. Expansion board introduction_V1.0
  • 2. STM32 development environment build
  • 3. Key control buzzer sounding
  • 4. FreeRTOS applications
  • 5. Serial communication
  • 6. SBUS model airplane remote control
  • 7. CAN bus communication
  • 8. RGB colorful light bar
  • 9. Timer interrupt control PWM servos
  • 10. Control serial servos
  • 11. Nine-axis attitude sensor acquires data
  • 12. Control motor forward and reverse
  • 13. Timer Capture Encoder Data
  • 14. Theory of Robot Kinematics Analysis
  • 14.1.Mecanum wheel
  • 14.2.Ackerman
  • 14.3.4WD
  • 15. PID control of robot motion
19. ROS2-Basic course
  • 1. Update the firmware of the expansion board
  • 2.Close the large self-starting program at boot
  • 3. Install Rosmaster driver library
  • 4. Buzzer sounding
  • 5. Control PWM servo
  • 6. RGB colorful light bar special effects show
  • 7. Control motor forward and reverse
  • 8. Controlling robot motion
  • 9. Control serial servos
20. ROS2-Linux operating systemnew
  • 01. Virtual Machines
  • 02. Linux Basics
  • 03. Remote control
  • 04. Multi-computer communication configuration
  • 05. Static ip and hotspot mode
  • 06. Bind device ID
  • 07.Webpage real-time monitoring
  • 08. Expansion Tutorial
  • 09-1.Jetson Nano write system file
  • 09-2. Raspberry Pi write system file
  • 09-3.Orin write system
  • 10.Jetpack old system upgraded to SUPER systemnew
21.ROS2 -Docker(Nano Pi)
  • 1. docker overview and docker installation
  • 2. docker image container common command
  • 3. docker image in-depth understanding and publishing images
  • 4. docker hardware interaction and data processing
  • 5. Enter the docker container of the robot
  • 6. docker in the robot development environment build
  • 7. Customer's method of updating docker images in the future
22.ROS2- ROS2 Basic Tutorial
  • 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
23. ROS2-Robot control course
  • 1. PID algorithm theory
  • 2. Robot information release
  • 3. Robot control
  • 4. Robot state estimation
  • 5. Robot calibration
  • 6. URDF model
24. ROS2-Lidar course
  • 1-1. Introduction and use of SLAM lidar
  • 1-2. Introduction and use of 4ROS lidar
  • 2. Lidar obstacle avoidance fun gameplay
  • 3. Lidar tracking fun gameplay
  • 4. Patrol function play
  • 5. gmapping map building algorithm
  • 6. cartographer building algorithm
  • 7. Navigation and obstacle avoidance
  • 8. Rosmaster_R2 using the app to build maps
  • 9. Rosmaster_R2 navigating with the app
25. ROS2-OpenCV courses
  • 1. opencv basic course
  • 2. ROS+opencv application
  • 3. QR code creation and recognition
  • 4. AR Vision
  • 5. mediapipe fun gameplay
  • 6. Patrol line autopilot
26. ROS2-Depth camera courses
  • 1. Depth camera use
  • 2. Camera calibration
  • 3. Color tracking
  • 4. KCF object tracking
  • 5. ORB_SLAM2 Basics
  • 6. ORB_SLAM2 PCL mapping
  • 7. ORB_SLAM2 Octomap mapping
  • 8. RTAB-Map 3D mapping navigation
27.ROS2- Voice control courses
  • 0. How to use old voice module in new image
  • 1.1 Introduction to the module-New
  • 1.2 Voice Control Module Port Binding-New
  • 1.3 Introduction to the module-Old
  • 2. Voice control car movement
  • 3. Voice control autopilot
  • 4. Voice control color recognition
  • 5. Voice control color tracking
  • 6. Voice control multi-point navigation
28.Deep learning courses(SUPER)
  • 1.KNN recognizes handwritten digitsnew
  • 2.Basic use of TensorFlownew
  • 3.Basic use of PyTorch(jetson)new
  • 4.YOLOv11Model conversion(SUPER)new
  • 5.YOLOv11Dataset annotation(SUPER)new
  • 6.YOLOv11Model conversion + tensorrt acceleration(SUPER)new
  • 7.YOLOv11Object recognition(SUPER)new
29. ROS2-Multi-robot control
  • 1. Multi-robot control
  • 2. Multi-robot navigation
LLM tutorial
1.Development environment
  • 0. Model usage instructions
  • 1.Environments deployment
  • 2.Dialogue platform installation
2.Jetson Nano B01
  • 1.Qwen2 model
  • 2.TinyLlama model
  • 3.Phi-3 model
  • 4.Gemma model
  • 5.Orca Mini model
  • 6.StarCoder2 model
  • 7.DeepSeek-R1 model
  • 8.Expand LLaVA-Phi3
3.Jetson Orin NXNANO
  • 1.Llama3 model
  • 2.Qwen2 model
  • 3.Phi-3 model
  • 4.Gemma model
  • 5.WizardLM2 model
  • 6.Codellama model
  • 7.DeepSeek-R1 model
  • 8.Orca Mini model
  • 9.StarCoder2 model
  • 10.TinyLlama model
  • 11.Expand LLaVA
  • 12.Expand LLaVA-Phi3
4.Raspberry Pi 5B
  • 1.Meta AI Llama3 model
  • 2.Qwen2 model
  • 3.Phi-3 model
  • 4.Gemma model
  • 5.WizardLM2 model
  • 6.Meta AI Codellama model
  • 7.DeepSeek-R1 model
  • 8.Expand LLaVA
FAQ
  • 1.Using your own Jetson board, car cannot start normally
Download
  • RemoteCtrl_APP(iOS/Android)
  • Mapping_APP(iOS_Android)
  • Instruction Manual
  • SystemFile_ROS1
  • SystemFile_ROS2
  • SystemFile_ROS2_OrinNANOSUPER
  • SystemFile_ROS2_OrinNXSUPER
  • VM software
  • Code
  • Jetson_Boot_USB.tar.gz
  • Autopilot Annex
  • Other_Annex_File
  • LLM_SystemFile
  • ROS2_Basic_VM
Download ZIP

Welcome to ROSMASTER R2 repository

1. opencv basic course

1、OpenCV Basic Course

1.1、Reading Images and Presentations

1.1.1、Image Reading

img = cv2.imread('yahboom.jpg', 0) The first parameter is the path of the image, and the second parameter is how to read the image.

cv2.IMREAD_UNCHANGED:Keep the original format unchanged,-1;

cv2.IMREAD_GRAYSCALE:Read in the image in grayscale mode, which can be represented by 0;

cv2.IMREAD_COLOR:,Read in a color image, which can be represented by 1;

cv2.IMREAD_UNCHANGED:Read in an image and include its alpha channel, which can be represented by 2.

1.1.2、Image display

cv.imshow('frame', frame):Open a window named frame and display frame data (image/video data)

Parameter Meaning:

The first parameter represents the name of the created open window;

The second parameter represents the image to be displayed.

1.1.3、Code and actual effect display

Run sample program,

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 1_1.py
xxxxxxxxxx
import cv2 as cv
if __name__ == '__main__':
    img = cv.imread('yahboom.jpg')
    while True :
    cv.imshow("frame",img)
    action = cv.waitKey(10) & 0xFF
    if action == ord('q') or action == 113:
        break
    img.release()
    cv.destroyAllWindows()

image-20230425103403516

1.2、OpenCV image writing

1.2.1、Function method:cv2.imwrite('new_img_name', img)

Parameter Meaning:

The first parameter is the saved file name, and the second parameter is the saved image.

1.2.2、Code and actual effect display

Run sample program,

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 1_2.py
xxxxxxxxxx
import cv2 as cv
if __name__ == '__main__':
    img = cv.imread('yahboom.jpg')
    cv.imwrite("yahboom_new.jpg",img) #Create a new file yahboom_ New.jpg, and write yahboom.jpg in it
    new_img = cv.imread('yahboom_new.jpg') #Read newly written images
    while True :
        cv.imshow("frame",img)
        cv.imshow("new_frame",new_img)
    action = cv.waitKey(10) & 0xFF
    if action == ord('q') or action == 113:
        break
    img.release()
    cv.destroyAllWindows()

image-20230425103817060

1.3、OpenCV camera reading and displaying videos

1.3.1、Camera reading

capture=cv.VideoCapture(0)

Parameter Meaning:

The parameter in VideoCapture() is 0, which means to open the built-in camera of the notebook. If the parameter is the video file path, it means to open the video,such as cap =cv2.VideoCapture(“../test.avi”)

1.3.2、Display Camera Video

ret,img = frame.read()

Meaning of return value:

ret:ret is a bool value that determines whether the correct frame has been read back

img:Image data for each frame

1.3.3、Code and actual effect display

run a program,

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 1_3.py
xxxxxxxxxx
import cv2 as cv
if __name__ == '__main__':
    frame = cv.VideoCapture(0)
    while frame.isOpened():
        ret,img = frame.read()
        cv.imshow('frame',img)
        action = cv.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
        break
    frame.release()
    cv.destroyAllWindows()

image-20230425104402303

1.4、Openc pixel operation

1.4.1、Pixel operation, we can change any position to a new pixel color.

Firstly, we need to read the image first, then modify the value of bgr and assign an area to be black.

1.4.2、Code and actual effect display

run a program

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 1_4.py
xxxxxxxxxx
import cv2
if __name__ == '__main__':
    img = cv2.imread('yahboom.jpg')
    (b,g,r) = img[100,100]
    print(b,g,r)
    i=j=0
    for j in range(1,255):
    img[i,j] = (0,0,0)
    for j in range(1,255):
    img[i,j] = (0,0,0)
    while True :
        cv2.imshow("frame",img)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
    img.release()
    cv2.destroyAllWindows()

image-20230425104757385

The red box represents the modified pigment values.

2.1、OpenCV image scaling

2.1.1、cv2.resize(InputArray src,OutputArray dst, Size, fx, fy, interpolation)

Parameter Meaning:

InputArray src:input image

OutputArray ds:Output Picture

Size:Output Image Size

fx,fy:Scale factor along the x-axis and y-axis

interpolation:Insertion method, selectable from INTER_ NEAREST (Nearest-neighbor interpolation),INTER_ LINEAR (Bilinear interpolation (default)),INTER_ Area (resampling using pixel region relationships),INTER_ CUBIC (Bicubic interpolation of 4x4 pixel neighborhood),INTER_ LANCZOS4 (Lanczos interpolation of 8x8 pixel neighborhood).

NOTE:

  • Output size format is (width, height)

  • The default interpolation method is: Bilinear interpolation

2.1.2、Code and actual effect display

run a program

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 2_1.py
xxxxxxxxxx
import cv2
if __name__ == '__main__':
    img = cv2.imread('yahboom.jpg')
    print(img.shape)
    x, y = img.shape[0:2]
    img_test1 = cv2.resize(img, (int(y / 2), int(x / 2)))
    while True :
        cv2.imshow("frame",img)
        cv2.imshow('resize0', img_test1)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
    img.release()
    cv2.destroyAllWindows()

image-20230425105559311

2.2、OpenCV Image Clipping

2.2.1、Picture clipping

First, read the image, and then obtain the pixel area from the array. Select the shape area X: 300-500 Y: 500-700 in the following code, and note that the image size is 800 * 800, so the selected area should not exceed this resolution.

2.2.2、Code and actual effect display

run a program

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 2_2.py
xxxxxxxxxx
import cv2
if __name__ == '__main__':
    img = cv2.imread('yahboom.jpg')
    dst = img[0:100,100:200]
    while True :
        cv2.imshow("frame",img)
        cv2.imshow('dst', dst)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
        img.release()
        cv2.destroyAllWindows()

image-20230425110134190

2.3、OpenCV Image Pan

2.3.1、cv2.warpAffine(src, M, dsize[,dst[, flags[, borderMode[, borderValue]]]])

Parameter Meaning:

  • src:Input Image

  • M:Transformation matrix

  • dsize:The size of the output image

  • flags:Combination of interpolation methods (int type!)

  • borderMode:Boundary pixel mode (int type!)

  • borderValue:(Important!) Boundary fill values; By default, it is 0

Among the above parameters, M, as the Affine transformation matrix, generally reflects the relationship between translation and rotation, and is 2 of InputArray type × The transformation matrix of 3.

In daily Affine transformation, only the first three parameters are set, such as cv2.warpAffine (img, M, (rows, cols)).

Basic Affine transformation effect.

2.3.2、How to obtain the transformation matrix M? Here is an example to illustrate.

Convert the original image src to the target image dst through the conversion matrix M:

dst(x, y) = src(M11x + M12y+M13, M21x+M22y+M23)

Move the original image src 200 pixels to the right and 100 pixels down, and the corresponding relationship is:

dst(x, y) = src(x+200, y+100)

Complete the above expression, namely:

dst(x, y) = src(1·x + 0·y + 200, 0·x + 1·y + 100)

Based on the above expression, it can be determined that the values of each element in the corresponding transformation matrix M are:

M11=1

M12=0

M13=200

M21=0

M22=1

M23=100

Substitute the above values into the transformation matrix M to obtain:

M = [ ]

2.3.3、Code and actual effect display

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 2_3.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
    img = cv2.imread('yahboom.jpg')
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    matShift = np.float32([[1,0,10],[0,1,10]])# 2*3
    dst = cv2.warpAffine(img, matShift, (width,height))
    while True :
        cv2.imshow("frame",img)
        cv2.imshow('dst', dst)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
    img.release()
    cv2.destroyAllWindows()

image-20230425110914737

2.4、OpenCV image mirroring

2.4.1、The principle of image mirroring

There are two types of image mirroring transformations: horizontal mirroring and vertical mirroring. Horizontal mirroring takes the vertical centerline of the image as the axis, swapping the pixels of the image, that is, swapping the left and right halves of the image. Vertical mirroring is based on the horizontal centerline of the image, swapping the upper and lower halves of the image.

Transformation principle:

Set the width of the image to width and the length to height. (x, y) represents the transformed coordinates, and (x0, y0) represents the coordinates of the original image,

  • Horizontal Mirror Transform

    Forward mapping:x=width-x0-1,y=y0

    Backward mapping:x0=width-x-1,y0=y

  • Vertical Mirror Transform

    Upward mapping:x=x0,y=height-y0-1

    Downward mapping:x0=x,y0=height-y-1

Summary: During the horizontal mirror transformation, the entire image was traversed and each pixel was processed based on the mapping relationship. In fact, horizontal mirror transformation is the process of moving the columns of image coordinates to the right and the columns on the right to the left, which can be transformed in columns. The same applies to vertical mirror transformations, which can be transformed in behavioral units.

2.4.2、Taking vertical transformation as an example, let's see how Python implements it

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 2_4.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
    img = cv2.imread('yahboom.jpg')
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    deep = imgInfo[2]
    newImgInfo = (height*2,width,deep)
    dst = np.zeros(newImgInfo,np.uint8)#uint8
    for i in range(0,height):
        for j in range(0,width):
            dst[i,j] = img[i,j]
            dst[height*2-i-1,j] = img[i,j]
    while True :
        cv2.imshow("frame",img)
        cv2.imshow('dst', dst)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
    img.release()
    cv2.destroyAllWindows()

image-20230425111627555

3.1、Grayscale processing of opencv images

3.1.1、Image Grayscale

The process of transforming color image into Grayscale is the graying of image. The color of each pixel in a color image is determined by three components: R, G, and B, and each component can take a value of 0-255. This allows a pixel to have a color range of over 16 million (256 * 256 * 256=1677256). Grayscale is a special color image with the same R, G, and B components, and one pixel has a change range of 256. Therefore, in digital image processing, images of various formats are generally converted into Grayscale to reduce the calculation of subsequent images. The description of Grayscale, like color image, still reflects the distribution and characteristics of the overall and local chroma and highlight levels of the whole image.

3.1.2、Image grayscale processing

Grayscale processing is the process of transforming a color image into a Grayscale. A color image is divided into three components: R, G, and B, each displaying various colors such as red, green, and blue. Grayscale is the process of equalizing the R, G, and B components of a color. Pixels with large grayscale values are brighter (with a maximum pixel value of 255 indicating white), while those with lower grayscale values are darker (with a minimum pixel value of 0 indicating black). The core idea of grayscale image is that R=G=B, which is also known as the grayscale value.

1)Maximum method: Make the converted values of R, G, and B equal to the largest of the three values before conversion, that is, R=G=B=max (R, G, B). The grayscale image converted by this method has high brightness.

2)Average method: The values of R, G, and B after conversion are the average values of R, G, and B before conversion. Namely: R=G=B=(R+G+B)/3. The Grayscale produced by this method is relatively soft.

In OpenCV, use cv2. cvtColor (img1, cv2. COLOR_BGR2GRAY) to perform grayscale processing on images

3.1.3、Code and actual effect display

Run the program,

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 3_1.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
    img = cv2.imread('yahboom.jpg')
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    while True :
        cv2.imshow("frame",img)
        cv2.imshow('gray', gray)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
        img.release()
        cv2.destroyAllWindows()

image-20230425112455878

3.2、Binary processing of opencv images

3.2.1、The core idea of binarization

Set the threshold to 0 (black) or 255 (white) for images larger than the threshold, making the image a black and white image. The threshold can be fixed or adaptive. The adaptive threshold is generally a comparison between the average value of a pixel and the weighted sum of Gaussian distribution pixels in a region where this point is in the middle order. A difference can be set or not.

3.2.2、cv2.threshold(src, threshold, maxValue,thresholdType)

Parameter Meaning:

  • src:original image

  • threshold:Current threshold

  • maxVal:Maximum threshold, usually 255

  • thresholdType:The threshold type generally has the following values:,

    • THRESH_BINARY = 0,#The grayscale value of pixels larger than the threshold is set to maxValue (such as an 8-bit grayscale value with a maximum of 255), and the grayscale value of pixels smaller than the threshold is set to 0.

    • THRESH_BINARY_INV = 1,#The grayscale value of pixels larger than the threshold is set to 0, while those smaller than the threshold are set to maxValue.

    • THRESH_TRUNC = 2,#The grayscale value of pixels larger than the threshold is set to 0, while those smaller than the threshold are set to maxValue.

    • THRESH_TOZERO = 3,#If the grayscale value of a pixel is less than the threshold, no change will be made, while if it is greater than the threshold, all grayscale values will become 0.

    • THRESH_TOZERO_INV = 4 #If the grayscale value of a pixel is greater than this threshold, no change will be made. If the grayscale value of a pixel is less than this threshold, all grayscale values will become 0.

  • return value:

    • retval:Consistent with parameter threshold 3

    • dst: Final image

Note: Before binarization, we need to grayscale the color image to obtain a grayscale image.

3.2.3、Code and actual effect display

run a program

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 3_2.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
    img = cv2.imread('yahboom.jpg')
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    ret,thresh1=cv2.threshold(gray,180,255,cv2.THRESH_BINARY_INV)
    while True :
        cv2.imshow("frame",img)
        cv2.imshow('gray', gray)
        cv2.imshow("binary",thresh1)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
    img.release()
    cv2.destroyAllWindows()

image-20230425113650511

3.3、OpenCV image edge detection

3.3.1、The purpose of image edge detection

Significantly reduce the data size of the image while retaining its original image attributes. At present, there are multiple algorithms that can perform edge detection. Although Canny algorithm has a long history, it can be said that it is a standard algorithm for edge detection and is still widely used in research.

3.3.2、Canny edge detection algorithm

Among the currently commonly used edge detection methods, the Canny edge detection algorithm is one of the methods with strict definitions that can provide good and reliable detection. Due to its advantages of meeting the three standards of edge detection and simple implementation process, it has become one of the most popular algorithms for edge detection.

The Canny edge detection algorithm can be divided into the following 5 steps:

  • Use Gaussian filter to smooth the image and filter out noise

  • Calculate the gradient intensity and direction of each pixel in the image

  • Apply Non Maximum Suppression to eliminate spurious responses caused by edge detection

  • Applying Double Threshold Detection to Determine Real and Potential Edges

  • Edge detection is ultimately achieved by suppressing isolated weak edges

3.3.3、OpenCV Implementation Steps

  • Image Grayscale:gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

  • Gaussian filtering (denoising) image:GaussianBlur(src,ksize,sigmaX [,dst [,sigmaY [,borderType]]])-> dst

    • src:The input image is usually a grayscale image

    • ksize:Gaussian kernel size

    • sigmaX :Gaussian kernel standard deviation in the X direction

    • sigmaY :Gaussian kernel standard deviation in the Y direction

    • dst:Processed image

  • Canny method for processing images:edges=cv2.Canny( image, threshold1, threshold2[, apertureSize[,L2gradient]])

    • edges:Calculated edge image

    • image :The calculated edge image is generally the image obtained after Gaussian processing

    • threshold1 :The first threshold during processing

    • threshold2 :Second threshold during processing

    • apertureSize :Aperture size of Sobel operator

    • L2gradient :The default value for calculating the gradient amplitude of an image is False. If it is true, the more accurate L2 norm will be used for calculation (that is, the square sum of the derivatives in two directions will be derived again), otherwise the L1 norm will be used (the absolute values of the two Directional derivative will be added directly).

3.3.4、Code and actual effect display

run a program,

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 3_3.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
    img = cv2.imread('yahboom.jpg')
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    imgG = cv2.GaussianBlur(gray,(3,3),0)
    dst = cv2.Canny(imgG,50,50)
    while True :
        cv2.imshow("frame",img)
        cv2.imshow('gray', gray)
        cv2.imshow("canny",dst)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
    img.release()
    cv2.destroyAllWindows()

image-20230425114515047

3.4、OpenCV line segment drawing

3.4.1、cv2.line(dst,pt1,pt2,color,thickness=None,lineType=None,shift=None)

Parameter Meaning:

  • dst:Output image

  • pt1,pt2:Required parameter. The coordinate points of a line segment represent the starting and ending points, respectively

  • color:Required parameter. Used to set the color of line segments

  • thickness:Optional parameters. Used to set the width of line segments

  • lineType:Optional parameters. Used to set the type of line segment, selectable as 8 (8 adjacent connecting lines - default), 4 (4 adjacent connecting lines), and cv2. LINE_ AA is anti aliasing

3.4.2、Running program code and displaying actual effects

run a program,

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 3_4.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
    img = cv2.imread('yahboom.jpg')
    line = cv2.line(img, (50,20), (20,100), (255,0,255), 10)
    while True :
        cv2.imshow("line",line)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
        img.release()
        cv2.destroyAllWindows()

image-20230425114940700

3.5、OpenCV Draw Rectangle

3.5.1、cv2.rectangle(img,pt1,pt2,color,thickness=None,lineType=None,shift=None)

Parameter Meaning:

  • img:Canvas or carrier images

  • Required parameter. Used to set the color of the rectangle

  • color:Required parameter. Used to set the color of the rectangle

  • thickness:Optional parameters. Used to set the width of the rectangular edge. When the value is negative, it indicates filling the rectangle

  • lineType:Optional parameters. Used to set the type of line segment, optional 8 (8 adjacent connecting lines - default), 4 (4 adjacent connecting lines) cv2. LINE_ AA is anti aliasing

3.5.2、Code and Effect Display

run a program,

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 3_5.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
    img = cv2.imread('yahboom.jpg')
    rect = cv2.rectangle(img, (50,20), (100,100), (255,0,255), 10)
    while True :
        cv2.imshow("line",rect)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
    img.release()
    cv2.destroyAllWindows()

image-20230425115426818

3.6、Draw a circle with opencv

3.6.1、cv2.circle(img, center, radius, color[,thickness[,lineType]])

Parameter Meaning:

  • img:Drawing or carrier image cloth

  • center:It is the center coordinate, format: (50,50)

  • radius:radius

  • thickness: The thickness of the lines. Default is 1. If -1, it is filled with solid

  • lineType:Line type. The default is 8, connection type. The following table explains

    parameterParameter Description
    cv2.FILLEDFill
    cv2.LINE_44 Connection Types
    cv2.LINE_88 Connection Types
    cv2.LINE_AAAnti aliasing, this parameter will make the lines smoother

3.6.2、Code and actual effect display

run a program,

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 3_6.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
    img = cv2.imread('yahboom.jpg')
    circle = cv2.circle(img, (80,80), 50, (255,0,255), 10)
    while True :
        cv2.imshow("circle",circle)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
    img.release()
    cv2.destroyAllWindows()

image-20230425115852912

3.7、Drawing Ellipses with OpenCV

3.7.1、cv2.ellipse(img, center, axes, angle, StartAngle, endAngle, color[,thickness[,lineType])

Parameter Meaning:

  • center:The center point of an ellipse,(x,y)

  • axes:Refers to short radius and long radius,(x,y)

  • StartAngle:The angle of the starting angle of the arc

  • endAngle:The angle of the ending angle of the arc

  • Img, color, thickness, and lineType can refer to the description of the circle

3.7.2、Code and actual effect display

run a program,

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 3_7.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
    img = cv2.imread('yahboom.jpg')
    ellipse = cv2.ellipse(img, (80,80), (20,50),0,0, 360,(255,0,255), 5)
    while True :
        cv2.imshow("ellipse",ellipse)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
    img.release()
    cv2.destroyAllWindows()

image-20230425120536291

3.8、Opencv drawing polygons

3.8.1、cv2.polylines(img,[pts],isClosed, color[,thickness[,lineType]])

Parameter Meaning:

  • pts:Polygon Vertex

  • isClosed:Closed or not.(True/False)

  • Other parameters refer to the drawing parameters of the circle

3.8.2、Code and actual effect display

run a program

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 3_8.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
    img = cv2.imread('yahboom.jpg')
    points = np.array([[120,50], [40,140], [120,70], [110,110], [50,50]],np.int32)
    polylines = cv2.polylines(img, [points],True,(255,0,255), 5)
    while True :
        cv2.imshow("polylines",polylines)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
    img.release()
    cv2.destroyAllWindows()

image-20230425120919591

3.9、OpenCV drawing text

3.9.1、cv2.putText(img, str, origin, font, size,color,thickness)

Parameter Meaning:

  • img:input image

  • str:Drawn Text

  • origin:The upper left corner coordinate (integer) can be understood as where the text starts

  • font:typeface

  • size:font size

  • color:font color

  • thickness:font-weight

3.9.2、Code and actual effect display

run a program

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 3_9.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
    img = cv2.imread('yahboom.jpg')
    cv2.putText(img,'This is Yahboom!',(50,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,200,0),2)
    while True :
        cv2.imshow("img",img)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
    img.release()
    cv2.destroyAllWindows()

image-20230425121345553

4.1、OpenCV repair image

Inpainting is a kind of algorithm in computer vision, whose goal is to fill the area in the image or video. This area is identified using binary masks, and filling is usually done based on the boundary information of the area that needs to be filled. The most common application of Inpainting is to restore old scanned photos. It is also used to remove small unnecessary objects from images.

4.1.1、dst = cv2.inpaint(src, inpaintMask, inpaintRadius, flags)

Parameter Meaning:

  • src:Source image, which is the image that needs to be repaired

  • inpaintMask:Binary mask, indicating the pixels to be repaired.

  • dst:Final image

  • inpaintRadius:Represents the radius of the repair

  • flags : Repair algorithm, mainly including INPAINT_NS (Navier-Stokes based method) or INPAINT_TELEA (Fastmarching based method)

The repair based on Navier Stokes should be slower and tend to produce more ambiguous results than the fast marching method. In practice, we have not found this situation. INPAINT_ NS produced better results in our testing and slightly faster than INPAINT_ TELEA.

4.1.2、Code and actual effect display

(1)、Firstly, based on the intact image, we will add damage to it, which can be understood as modifying the pixel values of specific parts,

run a program,

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 4_1_1.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
    img = cv2.imread('yahboom.jpg')
    for i in range(50,100):
        img[i,50] = (0,0,0)
        img[i,50+1] = (0,0,0)
        img[i,50-1] = (0,0,0)
    for i in range(100,150):
        img[150,i] = (0,0,0)
        img[150,i+1] = (0,0,0)
        img[150-1,i] = (0,0,0)
    cv2.imwrite("damaged.jpg",img)
    dam_img = cv2.imread('damaged.jpg')
    while True :
        cv2.imshow("dam_img",dam_img)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
    img.release()
    cv2.destroyAllWindows()

After running, an image will be generated, which is considered as a damaged image of the original image,

image-20230425122214505

(2)、To fix the photo you just created, first read it, then create a mask, and finally use the function to fix it

run a program

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 4_1_2.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
    dam_img = cv2.imread('damaged.jpg')
    imgInfo = dam_img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    paint = np.zeros((height,width,1),np.uint8)
    for i in range(50,100):
        paint[i,50] = 255
        paint[i,50+1] = 255
        paint[i,50-1] = 255
    for i in range(100,150):
        paint[150,i] = 255
        paint[150+1,i] = 255
        paint[150-1,i] = 255
    dst_img = cv2.inpaint(dam_img,paint,3,cv2.INPAINT_TELEA)
    while True :
        cv2.imshow("dam_img",dam_img)
        cv2.imshow("paint",paint)
        cv2.imshow("dst",dst_img)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
    img.release()
    cv2.destroyAllWindows()

image-20230425122435840

As shown in the figure, the left side shows the pre repair image, the middle is the mask image, and the right side is the original image after repair.

4.2、OpenCV image brightness enhancement

Implementation process: Synchronize and amplify the three channel values of each pixel, while keeping the channel values between 0 and 255. In fact, it means traversing each pixel, adding or subtracting numerical values, and then determining whether the three channel rgb is in the 0 to 255 range. If it is greater than or less than, the value is 255 or 0.

4.2.1、Code and actual effect display

run a program,

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 4_2.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
    img = cv2.imread('yahboom.jpg')
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    dst = np.zeros((height,width,3),np.uint8)
    for i in range(0,height):
        for j in range(0,width):
            (b,g,r) = img[i,j]
            bb = int(b) + 100
            gg = int(g) + 100
            rr = int(r) + 100
            if bb > 255:
                bb = 255
            if gg > 255:
                gg = 255
            if rr > 255:
                rr = 255
            dst[i,j] = (bb,gg,rr)
    while True :
        cv2.imshow("dst",dst)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
    img.release()
    cv2.destroyAllWindows()

The image on the left is the original image, while the image on the back shows the photo with increased brightness.

4.3、OpenCV Image Peeling and Whitening

OpenCV implements the function of peeling and whitening images, and the principle of implementation is basically the same as the principle of "1.20 OpenCV image brightness enhancement". However, here we do not need to process the r value, we only need to follow this formula, p=p (x) * 1.4+y, where p (x) represents the b or g channel, y represents the value that needs to be increased or decreased. Similarly, after adding a value, we need to make a judgment on the value.

4.3.1、Code and actual effect display

run a program

x
cd ~/yahboomcar_ros2_ws/yahboomcar_ws/src/yahboomcar_astra/scripts/opencv/
python3 4_3.py
xxxxxxxxxx
import cv2
import numpy as np
if __name__ == '__main__':
    img = cv2.imread('yahboom.jpg')
    imgInfo = img.shape
    height = imgInfo[0]
    width = imgInfo[1]
    dst = np.zeros((height,width,3),np.uint8)
    for i in range(0,height):
        for j in range(0,width):
            (b,g,r) = img[i,j]
            bb = int(b*1.4) + 5
            gg = int(g*1.4) + 5
            if bb > 255:
                bb = 255
            if gg > 255:
                gg = 255
            dst[i,j] = (bb,gg,r)
    while True :
        cv2.imshow("origin",img)
        cv2.imshow("dst",dst)
        action = cv2.waitKey(10) & 0xFF
        if action == ord('q') or action == 113:
            break
    img.release()
    cv2.destroyAllWindows()

image-20230425123116830

Rosmaster_R2 navigating with the app
ROS+opencv application

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
QR Code

Copyright © 2017-2026 Yahboom. All Rights Reserved.

EN/中文