当前位置: 首页 > news >正文

如何使用AI快速编程实现标注ROS2中sensor_msgs/msg/Image图像色彩webots2025a

传统模式

学ros2,学opencv4,学……半个月过去了,也许已经放弃了。


AI模式

5分钟搞定。

提示词:

ros2 jazzy使用python编程实现在主题/camera/image_color,类型sensor_msgs/msg/Image,标记出绿色,绘制一个框,给出全部实现代码,opencv版本4.1。

如何使用AI快速编程实现标注ROS2中sensor_msgs


import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
import numpy as npclass GreenBoxDetector(Node):def __init__(self):super().__init__('green_box_detector')# 创建CvBridge实例self.bridge = CvBridge()# 创建订阅者,订阅/camera/image_color主题self.subscription = self.create_subscription(Image,'/camera/image_color',self.image_callback,10)self.subscription  # 防止未使用的变量警告self.get_logger().info('Green Box Detector Node Started')def image_callback(self, msg):try:# 将ROS图像消息转换为OpenCV图像cv_image = self.bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')# 转换为HSV颜色空间,更容易检测绿色hsv = cv2.cvtColor(cv_image, cv2.COLOR_BGR2HSV)# 定义绿色的HSV范围lower_green = np.array([35, 50, 50])upper_green = np.array([85, 255, 255])# 创建掩膜,只保留绿色部分mask = cv2.inRange(hsv, lower_green, upper_green)# 寻找轮廓contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 遍历所有轮廓,找到最大的轮廓并绘制矩形框if contours:max_contour = max(contours, key=cv2.contourArea)x, y, w, h = cv2.boundingRect(max_contour)# 绘制矩形框cv2.rectangle(cv_image, (x, y), (x + w, y + h), (0, 255, 0), 2)# 显示图像cv2.imshow('Green Box Detection', cv_image)cv2.waitKey(1)except Exception as e:self.get_logger().error(f'Error processing image: {e}')def main(args=None):rclpy.init(args=args)node = GreenBoxDetector()try:rclpy.spin(node)except KeyboardInterrupt:passfinally:# 清理cv2.destroyAllWindows()node.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

摘要:本文介绍了一种使用AI快速实现ROS2图像处理的方法。通过Python编写ROS2节点,订阅/camera/image_color主题,利用OpenCV4.1检测图像中的绿色区域并绘制边框。关键步骤包括:1)使用cv_bridge转换ROS图像消息;2)HSV颜色空间转换和绿色范围设定;3)轮廓检测与矩形框绘制;4)创建ROS2包并配置setup.py。相比传统学习方式,该方法通过具体代码示例和完整实现方案,大幅提升了开发效率,特别适合需要快速实现图像处理功能的开发者。


要在ROS2中使用Python编写一个节点,订阅主题/camera/image_color(类型为sensor_msgs/msg/Image),并使用OpenCV 4.1标记出图像中的绿色区域并绘制一个框,你需要使用cv_bridge来将ROS图像消息转换为OpenCV格式,然后进行图像处理。

以下是完整的实现代码:

1. 安装必要的依赖

确保你已经安装了ROS2 Jazzy和OpenCV 4.1。同时,确保安装了cv_bridgeopencv-python

 

bash

pip install opencv-python==4.1.0.25

2. 创建ROS2 Python节点

创建一个Python脚本,例如green_box_detector.py

 

python

import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
import numpy as npclass GreenBoxDetector(Node):def __init__(self):super().__init__('green_box_detector')# 创建CvBridge实例self.bridge = CvBridge()# 创建订阅者,订阅/camera/image_color主题self.subscription = self.create_subscription(Image,'/camera/image_color',self.image_callback,10)self.subscription  # 防止未使用的变量警告self.get_logger().info('Green Box Detector Node Started')def image_callback(self, msg):try:# 将ROS图像消息转换为OpenCV图像cv_image = self.bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')# 转换为HSV颜色空间,更容易检测绿色hsv = cv2.cvtColor(cv_image, cv2.COLOR_BGR2HSV)# 定义绿色的HSV范围lower_green = np.array([35, 50, 50])upper_green = np.array([85, 255, 255])# 创建掩膜,只保留绿色部分mask = cv2.inRange(hsv, lower_green, upper_green)# 寻找轮廓contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 遍历所有轮廓,找到最大的轮廓并绘制矩形框if contours:max_contour = max(contours, key=cv2.contourArea)x, y, w, h = cv2.boundingRect(max_contour)# 绘制矩形框cv2.rectangle(cv_image, (x, y), (x + w, y + h), (0, 255, 0), 2)# 显示图像cv2.imshow('Green Box Detection', cv_image)cv2.waitKey(1)except Exception as e:self.get_logger().error(f'Error processing image: {e}')def main(args=None):rclpy.init(args=args)node = GreenBoxDetector()try:rclpy.spin(node)except KeyboardInterrupt:passfinally:# 清理cv2.destroyAllWindows()node.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

3. 创建setup.pypackage.xml

为了使ROS2能够识别你的节点,你需要创建一个Python包。假设你的包名为green_box_detector,创建以下文件:

package.xml:
 

xml

<?xml version="1.0"?>
<package format="3"><name>green_box_detector</name><version>0.0.0</version><description>Detects green boxes in camera images</description><maintainer email="your_email@example.com">Your Name</maintainer><license>Apache License 2.0</license><depend>rclpy</depend><depend>sensor_msgs</depend><depend>cv_bridge</depend><depend>opencv-python</depend><test_depend>ament_copyright</test_depend><test_depend>ament_flake8</test_depend><test_depend>ament_pep257</test_depend><test_depend>python3-pytest</test_depend><export><build_type>ament_python</build_type></export>
</package>
setup.py:
 

python

from setuptools import setuppackage_name = 'green_box_detector'setup(name=package_name,version='0.0.0',packages=[package_name],data_files=[('share/ament_index/resource_index/packages',['resource/' + package_name]),('share/' + package_name, ['package.xml']),],install_requires=['setuptools'],zip_safe=True,maintainer='Your Name',maintainer_email='your_email@example.com',description='Detects green boxes in camera images',license='Apache License 2.0',tests_require=['pytest'],entry_points={'console_scripts': ['green_box_detector = green_box_detector.green_box_detector:main',],},
)

4. 构建和运行

将上述文件放在以下目录结构中:

 
green_box_detector/
├── green_box_detector/
│   ├── __init__.py
│   └── green_box_detector.py
├── package.xml
├── resource/
│   └── green_box_detector
└── setup.py

然后,在包的根目录下运行:

 

bash

colcon build
source install/setup.bash
ros2 run green_box_detector green_box_detector

注意事项

  1. OpenCV版本:确保安装的OpenCV版本是4.1.0.25。如果版本不匹配,可能会导致兼容性问题。
  2. HSV范围:绿色的HSV范围可能需要根据实际场景调整。上述代码中的范围是常见的绿色范围,但可能需要根据光照条件微调。
  3. 性能:如果图像处理较慢,可以考虑优化轮廓检测或降低图像分辨率。

这样,你就实现了一个ROS2节点,能够订阅摄像头图像并标记出绿色区域。


#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
import cv2
import numpy as np
from typing import Optional, Listclass GreenBoxDetector(Node):"""ROS2节点,用于检测图像中的绿色物体并绘制边界框"""# 颜色范围常量 (HSV格式)LOWER_GREEN = np.array([35, 50, 50])UPPER_GREEN = np.array([85, 255, 255])# 轮廓检测参数MIN_CONTOUR_AREA = 500  # 忽略小于此面积的轮廓# 显示参数WINDOW_NAME = "Green Object Detection"BOX_COLOR = (0, 255, 0)  # BGR格式的绿色BOX_THICKNESS = 2def __init__(self):super().__init__('green_box_detector')# 参数声明self.declare_parameter('debug_mode', False)self.debug_mode = self.get_parameter('debug_mode').value# 初始化成员变量self.bridge = CvBridge()self.image_sub = Noneself._init_subscriptions()# 调试信息self.get_logger().info(f"Node started with debug_mode={self.debug_mode}")def _init_subscriptions(self):"""初始化订阅者"""try:self.image_sub = self.create_subscription(Image,'/camera/image_color',self._image_callback,qos_profile=rclpy.qos.qos_profile_sensor_data)except Exception as e:self.get_logger().error(f"Failed to create subscription: {e}")raisedef _image_callback(self, msg: Image) -> None:"""图像处理回调函数"""try:# 转换ROS图像到OpenCV格式cv_image = self._convert_image(msg)if cv_image is None:return# 检测绿色物体processed_image = self._detect_green_objects(cv_image)# 显示结果if self.debug_mode and processed_image is not None:self._show_image(processed_image)except CvBridgeError as e:self.get_logger().error(f"CV Bridge error: {e}")except Exception as e:self.get_logger().error(f"Error processing image: {e}")def _convert_image(self, msg: Image) -> Optional[np.ndarray]:"""将ROS图像消息转换为OpenCV格式"""try:# 使用bgr8编码直接获取BGR格式图像cv_image = self.bridge.imgmsg_to_cv2(msg, 'bgr8')return cv_imageexcept CvBridgeError as e:self.get_logger().error(f"Image conversion failed: {e}")return Nonedef _detect_green_objects(self, image: np.ndarray) -> Optional[np.ndarray]:"""检测图像中的绿色物体并绘制边界框"""try:# 创建HSV格式的副本用于颜色检测hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)# 创建绿色掩膜mask = cv2.inRange(hsv, self.LOWER_GREEN, self.UPPER_GREEN)# 形态学操作减少噪声mask = self._apply_morphological_ops(mask)# 查找轮廓contours = self._find_contours(mask)# 在原图上绘制检测结果result_image = image.copy()if contours:self._draw_bounding_boxes(result_image, contours)return result_imageexcept Exception as e:self.get_logger().error(f"Object detection failed: {e}")return Nonedef _apply_morphological_ops(self, mask: np.ndarray) -> np.ndarray:"""应用形态学操作减少噪声"""kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)return maskdef _find_contours(self, mask: np.ndarray) -> List[np.ndarray]:"""查找并过滤轮廓"""try:contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 过滤掉太小的轮廓return [cnt for cnt in contours if cv2.contourArea(cnt) > self.MIN_CONTOUR_AREA]except Exception as e:self.get_logger().error(f"Contour detection failed: {e}")return []def _draw_bounding_boxes(self, image: np.ndarray, contours: List[np.ndarray]) -> None:"""在图像上绘制边界框"""try:# 找到最大轮廓(假设这是我们要检测的主要物体)main_contour = max(contours, key=cv2.contourArea)x, y, w, h = cv2.boundingRect(main_contour)# 绘制矩形框cv2.rectangle(image, (x, y), (x + w, y + h), self.BOX_COLOR, self.BOX_THICKNESS)# 可选:绘制所有轮廓(调试用)if self.debug_mode:cv2.drawContours(image, contours, -1, (255, 0, 0), 1)except Exception as e:self.get_logger().error(f"Drawing bounding box failed: {e}")def _show_image(self, image: np.ndarray) -> None:"""显示处理后的图像"""try:cv2.imshow(self.WINDOW_NAME, image)cv2.waitKey(1)except Exception as e:self.get_logger().error(f"Failed to show image: {e}")def cleanup(self) -> None:"""清理资源"""if self.debug_mode:cv2.destroyWindow(self.WINDOW_NAME)self.get_logger().info("Node shutdown complete")def main(args=None):"""主函数"""rclpy.init(args=args)detector = Nonetry:detector = GreenBoxDetector()rclpy.spin(detector)except KeyboardInterrupt:detector.get_logger().info("Keyboard interrupt received")except Exception as e:detector.get_logger().error(f"Node crashed: {e}")finally:if detector is not None:detector.cleanup()detector.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

优化后的ROS2绿色物体检测节点

下面是对原始代码的详细解析和优化,包括性能改进、代码健壮性增强和可读性提升。

优化点分析

  1. 参数化配置:将HSV范围等可调参数提取为常量
  2. 错误处理:增强异常处理,避免节点崩溃
  3. 性能优化:减少不必要的计算和内存分配
  4. 代码结构:更清晰的函数划分和注释
  5. 资源管理:确保OpenCV窗口正确关闭
  6. 调试支持:添加调试模式开关

优化后的完整代码

 

python

#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
import cv2
import numpy as np
from typing import Optional, Listclass GreenBoxDetector(Node):"""ROS2节点,用于检测图像中的绿色物体并绘制边界框"""# 颜色范围常量 (HSV格式)LOWER_GREEN = np.array([35, 50, 50])UPPER_GREEN = np.array([85, 255, 255])# 轮廓检测参数MIN_CONTOUR_AREA = 500  # 忽略小于此面积的轮廓# 显示参数WINDOW_NAME = "Green Object Detection"BOX_COLOR = (0, 255, 0)  # BGR格式的绿色BOX_THICKNESS = 2def __init__(self):super().__init__('green_box_detector')# 参数声明self.declare_parameter('debug_mode', False)self.debug_mode = self.get_parameter('debug_mode').value# 初始化成员变量self.bridge = CvBridge()self.image_sub = Noneself._init_subscriptions()# 调试信息self.get_logger().info(f"Node started with debug_mode={self.debug_mode}")def _init_subscriptions(self):"""初始化订阅者"""try:self.image_sub = self.create_subscription(Image,'/camera/image_color',self._image_callback,qos_profile=rclpy.qos.qos_profile_sensor_data)except Exception as e:self.get_logger().error(f"Failed to create subscription: {e}")raisedef _image_callback(self, msg: Image) -> None:"""图像处理回调函数"""try:# 转换ROS图像到OpenCV格式cv_image = self._convert_image(msg)if cv_image is None:return# 检测绿色物体processed_image = self._detect_green_objects(cv_image)# 显示结果if self.debug_mode and processed_image is not None:self._show_image(processed_image)except CvBridgeError as e:self.get_logger().error(f"CV Bridge error: {e}")except Exception as e:self.get_logger().error(f"Error processing image: {e}")def _convert_image(self, msg: Image) -> Optional[np.ndarray]:"""将ROS图像消息转换为OpenCV格式"""try:# 使用bgr8编码直接获取BGR格式图像cv_image = self.bridge.imgmsg_to_cv2(msg, 'bgr8')return cv_imageexcept CvBridgeError as e:self.get_logger().error(f"Image conversion failed: {e}")return Nonedef _detect_green_objects(self, image: np.ndarray) -> Optional[np.ndarray]:"""检测图像中的绿色物体并绘制边界框"""try:# 创建HSV格式的副本用于颜色检测hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)# 创建绿色掩膜mask = cv2.inRange(hsv, self.LOWER_GREEN, self.UPPER_GREEN)# 形态学操作减少噪声mask = self._apply_morphological_ops(mask)# 查找轮廓contours = self._find_contours(mask)# 在原图上绘制检测结果result_image = image.copy()if contours:self._draw_bounding_boxes(result_image, contours)return result_imageexcept Exception as e:self.get_logger().error(f"Object detection failed: {e}")return Nonedef _apply_morphological_ops(self, mask: np.ndarray) -> np.ndarray:"""应用形态学操作减少噪声"""kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)return maskdef _find_contours(self, mask: np.ndarray) -> List[np.ndarray]:"""查找并过滤轮廓"""try:contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 过滤掉太小的轮廓return [cnt for cnt in contours if cv2.contourArea(cnt) > self.MIN_CONTOUR_AREA]except Exception as e:self.get_logger().error(f"Contour detection failed: {e}")return []def _draw_bounding_boxes(self, image: np.ndarray, contours: List[np.ndarray]) -> None:"""在图像上绘制边界框"""try:# 找到最大轮廓(假设这是我们要检测的主要物体)main_contour = max(contours, key=cv2.contourArea)x, y, w, h = cv2.boundingRect(main_contour)# 绘制矩形框cv2.rectangle(image, (x, y), (x + w, y + h), self.BOX_COLOR, self.BOX_THICKNESS)# 可选:绘制所有轮廓(调试用)if self.debug_mode:cv2.drawContours(image, contours, -1, (255, 0, 0), 1)except Exception as e:self.get_logger().error(f"Drawing bounding box failed: {e}")def _show_image(self, image: np.ndarray) -> None:"""显示处理后的图像"""try:cv2.imshow(self.WINDOW_NAME, image)cv2.waitKey(1)except Exception as e:self.get_logger().error(f"Failed to show image: {e}")def cleanup(self) -> None:"""清理资源"""if self.debug_mode:cv2.destroyWindow(self.WINDOW_NAME)self.get_logger().info("Node shutdown complete")def main(args=None):"""主函数"""rclpy.init(args=args)detector = Nonetry:detector = GreenBoxDetector()rclpy.spin(detector)except KeyboardInterrupt:detector.get_logger().info("Keyboard interrupt received")except Exception as e:detector.get_logger().error(f"Node crashed: {e}")finally:if detector is not None:detector.cleanup()detector.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

优化说明

  1. 模块化设计
    • 将不同功能拆分为独立方法,提高代码可读性和可维护性
    • 添加了详细的文档字符串
  2. 性能优化
    • 添加了形态学操作(开运算和闭运算)减少噪声
    • 设置了最小轮廓面积阈值,忽略小区域
    • 使用更高效的轮廓检测方法
  3. 健壮性增强
    • 全面的异常处理
    • 资源清理确保OpenCV窗口正确关闭
    • 类型提示提高代码可靠性
  4. 可配置性
    • 通过ROS2参数支持调试模式
    • 将关键参数提取为类常量,便于调整
  5. 调试支持
    • 可选显示所有检测到的轮廓(蓝色)
    • 详细的日志记录
  6. 内存管理
    • 避免不必要的图像复制
    • 正确处理图像引用

使用说明

  1. 将代码保存为green_box_detector.py
  2. 创建相应的package.xmlsetup.py(与之前类似)
  3. 构建并运行:
     

    bash

    colcon build
    source install/setup.bash
    ros2 run your_package_name green_box_detector
  4. 可选参数:
     

    bash

    ros2 run your_package_name green_box_detector --ros-args -p debug_mode:=true

这个优化版本更适合生产环境使用,同时保留了足够的调试能力。


http://www.dtcms.com/a/569984.html

相关文章:

  • 专业定制网站开发公司做纺织的用什么网站
  • 20251104让AIO-3576Q38开发板跑Rockchip的原厂Android14进行性能测试【使用天启的DTS】
  • 【案例】三维扫描实现
  • 无人设备遥控器之天线技术分析
  • 宁波市建设工程监理协会网站工程公司年会发言稿
  • 广州旅游团购网站建设中山seo
  • mlir 编译器学习笔记之四 -- 调度
  • 网站建设实施步骤网站源代码上传
  • 2025年 汽车零部件行业MES厂商分析
  • 学校网站制作公司公司企业邮箱怎么填写
  • 网站改版 目的网络建设公司前景
  • Milvus:索引概述(十二)
  • 【25真题】C9之一,质量极高!
  • GitPuk零基础学习,如何进行标签管理
  • Git多分支开发规范与操作指南
  • 国外网站app网址提交大全
  • pulsar SDK在Linux的使用
  • 11.4八股
  • Trae-Agent 使用本地模型
  • 哪个网站开发小程序网站建设与维护的软件
  • Docker(四)_导出容器(不含历史层)
  • GitHub Copilot CLI: How to get started
  • Android ANR的解决方案
  • 亚马逊云科技与OpenAI战略合作深度分析:算力联盟重塑AI产业格局
  • 个人接外包的网站心悦俱乐部官方网站怎么做任务
  • 【Ros2学习】话题的发布与请求
  • 肥猫网站建设广西省河池建设局网站
  • CentOS7安装docker教程
  • 论文网站建设与运营拖曳式网站建设
  • Jenkins持续集成入门指南:自动化构建与部署的最佳实践