接下来我们就以机器视觉的任务为例,模拟实际机器人中节点的实现过程。
安装opencv库
sudo apt install python3-opencv
图片资源处理
将图片放在package下img目录下
在setup.py中配置
data_files=[('share/ament_index/resource_index/packages',['resource/' + package_name]),('share/' + package_name, ['package.xml']),(os.path.join('share', package_name), glob('img/*')),],
需要导入os和glob
import osfrom glob import glob
加载图片
from ament_index_python.packages import get_package_share_pathimg_dir_path = get_package_share_path('first_pkg')apple_path = img_dir_path / 'apple.jpg'image = cv2.imread(str(apple_path)) # 读取图像
完整代码
from ament_index_python.packages import get_package_share_pathimport rclpy # ROS2 Python接口库from rclpy.node import Node # ROS2 节点类import cv2 # OpenCV图像处理库import numpy as np # Python数值计算库lower_red = np.array([0, 90, 128]) # 红色的HSV阈值下限upper_red = np.array([180, 255, 255]) # 红色的HSV阈值上限def object_detect(image):hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 图像从BGR颜色模型转换为HSV模型mask_red = cv2.inRange(hsv_img, lower_red, upper_red) # 图像二值化contours, hierarchy = cv2.findContours(mask_red, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) # 图像中轮廓检测for cnt in contours: # 去除一些轮廓面积太小的噪声if cnt.shape[0] < 150:continue(x, y, w, h) = cv2.boundingRect(cnt) # 得到苹果所在轮廓的左上角xy像素坐标及轮廓范围的宽和高cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2) # 将苹果的轮廓勾勒出来cv2.circle(image, (int(x+w/2), int(y+h/2)), 5, (0, 255, 0), -1) # 将苹果的图像中心点画出来cv2.imshow("object", image) # 使用OpenCV显示处理后的图像效果cv2.waitKey(0)cv2.destroyAllWindows()def main(args=None): # ROS2节点主入口main函数rclpy.init(args=args) # ROS2 Python接口初始化node = Node("node_object") # 创建ROS2节点对象并进行初始化node.get_logger().info("ROS2节点示例:检测图片中的苹果")img_dir_path = get_package_share_path('first_pkg')apple_path = img_dir_path / 'apple.jpg'image = cv2.imread(str(apple_path)) # 读取图像print(image)object_detect(image) # 苹果检测rclpy.spin(node) # 循环等待ROS2退出node.destroy_node() # 销毁节点对象rclpy.shutdown() # 关闭ROS2 Python接口
摄像头识别完整代码
import rclpy # ROS2 Python接口库from rclpy.node import Node # ROS2 节点类import cv2 # OpenCV图像处理库import numpy as np # Python数值计算库lower_red = np.array([0, 90, 128]) # 红色的HSV阈值下限upper_red = np.array([180, 255, 255]) # 红色的HSV阈值上限def object_detect(image):hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 图像从BGR颜色模型转换为HSV模型mask_red = cv2.inRange(hsv_img, lower_red, upper_red) # 图像二值化contours, hierarchy = cv2.findContours(mask_red, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) # 图像中轮廓检测for cnt in contours: # 去除一些轮廓面积太小的噪声if cnt.shape[0] < 150:continue(x, y, w, h) = cv2.boundingRect(cnt) # 得到苹果所在轮廓的左上角xy像素坐标及轮廓范围的宽和高cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2) # 将苹果的轮廓勾勒出来cv2.circle(image, (int(x+w/2), int(y+h/2)), 5, (0, 255, 0), -1) # 将苹果的图像中心点画出来cv2.imshow("object", image) # 使用OpenCV显示处理后的图像效果cv2.waitKey(50)def main(args=None): # ROS2节点主入口main函数rclpy.init(args=args) # ROS2 Python接口初始化node = Node("node_object_webcam") # 创建ROS2节点对象并进行初始化node.get_logger().info("ROS2节点示例:检测图像中的苹果")cap = cv2.VideoCapture(0)while rclpy.ok():ret, image = cap.read() # 读取一帧图像if ret == True:object_detect(image) # 苹果检测node.destroy_node() # 销毁节点对象rclpy.shutdown() # 关闭ROS2 Python接口
