接下来我们就以机器视觉的任务为例,模拟实际机器人中节点的实现过程。
image-20220527101249842.png

安装opencv库

  1. sudo apt install python3-opencv

图片资源处理

将图片放在package下img目录下

image.png

在setup.py中配置

  1. data_files=[
  2. ('share/ament_index/resource_index/packages',
  3. ['resource/' + package_name]),
  4. ('share/' + package_name, ['package.xml']),
  5. (os.path.join('share', package_name), glob('img/*')),
  6. ],

需要导入os和glob

  1. import os
  2. from glob import glob

加载图片

  1. from ament_index_python.packages import get_package_share_path
  2. img_dir_path = get_package_share_path('first_pkg')
  3. apple_path = img_dir_path / 'apple.jpg'
  4. image = cv2.imread(str(apple_path)) # 读取图像

完整代码

  1. from ament_index_python.packages import get_package_share_path
  2. import rclpy # ROS2 Python接口库
  3. from rclpy.node import Node # ROS2 节点类
  4. import cv2 # OpenCV图像处理库
  5. import numpy as np # Python数值计算库
  6. lower_red = np.array([0, 90, 128]) # 红色的HSV阈值下限
  7. upper_red = np.array([180, 255, 255]) # 红色的HSV阈值上限
  8. def object_detect(image):
  9. hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 图像从BGR颜色模型转换为HSV模型
  10. mask_red = cv2.inRange(hsv_img, lower_red, upper_red) # 图像二值化
  11. contours, hierarchy = cv2.findContours(mask_red, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) # 图像中轮廓检测
  12. for cnt in contours: # 去除一些轮廓面积太小的噪声
  13. if cnt.shape[0] < 150:
  14. continue
  15. (x, y, w, h) = cv2.boundingRect(cnt) # 得到苹果所在轮廓的左上角xy像素坐标及轮廓范围的宽和高
  16. cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2) # 将苹果的轮廓勾勒出来
  17. cv2.circle(image, (int(x+w/2), int(y+h/2)), 5, (0, 255, 0), -1) # 将苹果的图像中心点画出来
  18. cv2.imshow("object", image) # 使用OpenCV显示处理后的图像效果
  19. cv2.waitKey(0)
  20. cv2.destroyAllWindows()
  21. def main(args=None): # ROS2节点主入口main函数
  22. rclpy.init(args=args) # ROS2 Python接口初始化
  23. node = Node("node_object") # 创建ROS2节点对象并进行初始化
  24. node.get_logger().info("ROS2节点示例:检测图片中的苹果")
  25. img_dir_path = get_package_share_path('first_pkg')
  26. apple_path = img_dir_path / 'apple.jpg'
  27. image = cv2.imread(str(apple_path)) # 读取图像
  28. print(image)
  29. object_detect(image) # 苹果检测
  30. rclpy.spin(node) # 循环等待ROS2退出
  31. node.destroy_node() # 销毁节点对象
  32. rclpy.shutdown() # 关闭ROS2 Python接口

摄像头识别完整代码

  1. import rclpy # ROS2 Python接口库
  2. from rclpy.node import Node # ROS2 节点类
  3. import cv2 # OpenCV图像处理库
  4. import numpy as np # Python数值计算库
  5. lower_red = np.array([0, 90, 128]) # 红色的HSV阈值下限
  6. upper_red = np.array([180, 255, 255]) # 红色的HSV阈值上限
  7. def object_detect(image):
  8. hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 图像从BGR颜色模型转换为HSV模型
  9. mask_red = cv2.inRange(hsv_img, lower_red, upper_red) # 图像二值化
  10. contours, hierarchy = cv2.findContours(mask_red, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) # 图像中轮廓检测
  11. for cnt in contours: # 去除一些轮廓面积太小的噪声
  12. if cnt.shape[0] < 150:
  13. continue
  14. (x, y, w, h) = cv2.boundingRect(cnt) # 得到苹果所在轮廓的左上角xy像素坐标及轮廓范围的宽和高
  15. cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2) # 将苹果的轮廓勾勒出来
  16. cv2.circle(image, (int(x+w/2), int(y+h/2)), 5, (0, 255, 0), -1) # 将苹果的图像中心点画出来
  17. cv2.imshow("object", image) # 使用OpenCV显示处理后的图像效果
  18. cv2.waitKey(50)
  19. def main(args=None): # ROS2节点主入口main函数
  20. rclpy.init(args=args) # ROS2 Python接口初始化
  21. node = Node("node_object_webcam") # 创建ROS2节点对象并进行初始化
  22. node.get_logger().info("ROS2节点示例:检测图像中的苹果")
  23. cap = cv2.VideoCapture(0)
  24. while rclpy.ok():
  25. ret, image = cap.read() # 读取一帧图像
  26. if ret == True:
  27. object_detect(image) # 苹果检测
  28. node.destroy_node() # 销毁节点对象
  29. rclpy.shutdown() # 关闭ROS2 Python接口