2.ROS机器视觉——ROS图像(imgmsg)与opencv(cv2)对接

这篇具有很好参考价值的文章主要介绍了2.ROS机器视觉——ROS图像(imgmsg)与opencv(cv2)对接。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考:古月学院和ROS机器人开发实践

目标:实现ROS系统读取摄像头的图像,ROS读取的图像数据转化为opencv中的图像,opencv对接受的图像进行处理,最后返回给ROS系统可视化输出。

安装opencv库与相关的接口包

由于我用的ROS-Melodic版本,其中roscore只能在python2中执行,而视觉部分要在python3中执行,故将包安装在两个python中。(重要操作,因为其他有关于视觉的库,比如pytorch,是需要python3的,如果默认环境是python环境是python2,没把相应的包安装进python3,会报缺失依赖的错。)

(1条消息) ROS修改:ubuntu系统更改默认python版本(重要操作)_机械专业的计算机小白的博客-CSDN博客https://blog.csdn.net/wzfafabga/article/details/127191057?spm=1001.2014.3001.5501具体切换python版本方法在如上文章中。

sudo apt-get install ros-melodic-vision-opencv libopencv-dev ros-melodic-vision-opencv python-opencv

下载好相应的源码,放在工作空间的src中

guyueclass/planning&perception/robot_vision_beginner/robot_vision at main · guyuehome/guyueclass (github.com)https://github.com/guyuehome/guyueclass/tree/main/planning%26perception/robot_vision_beginner/robot_vision这个古月学院和ROS机器人开发实践的源码。

运行的代码

首先是usb_cam.launch

imgmsg_to_cv2,ROS,ros

<launch>

  <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
    <param name="video_device" value="/dev/video0" />
    <param name="image_width" value="640" />
    <param name="image_height" value="480" />
    <param name="pixel_format" value="yuyv" />
    <param name="camera_frame_id" value="usb_cam" />
    <param name="io_method" value="mmap"/>
  </node>

</launch>

 创建一个节点,之后作为发布者,摄像头的图像信息,其中参数必须和摄像头参数对应,要不会报错。

其次是cv_bridge_test.py

imgmsg_to_cv2,ROS,ros

 其中要修改python版本声明,因为molodic版本默认python版本是python2,但是现在视觉算法都是用的python3,在python3中才有实际意义。

修改了声明:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import rospy
import cv2
from cv_bridge import CvBridge, CvBridgeError
from sensor_msgs.msg import Image

class image_converter:
    def __init__(self):    
        # 创建cv_bridge,声明图像的发布者和订阅者
        self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
        self.bridge = CvBridge()
        self.image_sub = rospy.Subscriber("/usb_cam/image_raw", Image, self.callback)

    def callback(self,data):
        # 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式
        try:
            cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
        except CvBridgeError as e:
            print(e)

        # 在opencv的显示窗口中绘制一个圆,作为标记
        (rows,cols,channels) = cv_image.shape
        if cols > 60 and rows > 60 :
            cv2.circle(cv_image, (60, 60), 30, (0,0,255), -1)

        # 显示Opencv格式的图像
        cv2.imshow("Image window", cv_image)
        cv2.waitKey(3)

        # 再将opencv格式额数据转换成ros image格式的数据发布
        try:
            self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
        except CvBridgeError as e:
            print(e)

if __name__ == '__main__':
    try:
        # 初始化ros节点
        rospy.init_node("cv_bridge_test")
        rospy.loginfo("Starting cv_bridge_test node")
        image_converter()
        rospy.spin()
    except KeyboardInterrupt:
        print("Shutting down cv_bridge_test node.")
        cv2.destroyAllWindows()

根据最后通过rqt_graph生成的计算图来看,/usb_cam为通过launch文件生成的发布者节点,而/cv_bridge_test为if __name__ == '__main__':下初始化的节点cv_bridge_test作为订阅者。imgmsg_to_cv2,ROS,ros

import cv2
from cv_bridge import CvBridge, CvBridgeError
from sensor_msgs.msg import Image

cv2——opencv库

cv_bridge——通过调用此函数中的api进行ROS图像(imgmsg)与opencv图像(cv2)的转换。

sensor_msgs.msg——传感器数据类型,其中此处导入的是Image图像的数据类型。

        self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
        self.bridge = CvBridge()
        self.image_sub = rospy.Subscriber("/usb_cam/image_raw", Image, self.callback)

根据上面的计算图:

首先是订阅者,作用是接收usb_cam发布的图像原始信息,话题名/usb_cam/image_raw,话题名这里不能改的,因为在话题通信中,发布者和订阅者的话题名必须一样才能进行通信。

其次是发布者,注意这个发布者并不是和上面的订阅者成套,因为二者话题名不同,意味着二者是无法进行话题通信的。其中发布者发布的话题cv_bridge_image,数据类型为Image,可以通过rqt_image_view命令观察到。

self.bridge = CvBridge()定义一个句柄,之后可以灵活调用相关转换接口。

    def callback(self,data):
        # 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式
        try:
            cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
        except CvBridgeError as e:
            print(e)

        # 在opencv的显示窗口中绘制一个圆,作为标记
        (rows,cols,channels) = cv_image.shape
        if cols > 60 and rows > 60 :
            cv2.circle(cv_image, (60, 60), 30, (0,0,255), -1)

        # 显示Opencv格式的图像
        cv2.imshow("Image window", cv_image)
        cv2.waitKey(3)

        # 再将opencv格式额数据转换成ros image格式的数据发布
        try:
            self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
        except CvBridgeError as e:
            print(e)

这是回调函数,为话题通信订阅者的参数,其中通过最后一个参数调用了回调函数。

self.image_sub = rospy.Subscriber("/usb_cam/image_raw", Image, self.callback)

 同时在主函数中,不停的spin回头,达到不停的循环订阅的目的。

rospy.spin()

在回调函数中:

第一步,ROS原始图像信息转化为opencv中的图像信息。

cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")

第二步,在opencv中进行图像处理

        # 在opencv的显示窗口中绘制一个圆,作为标记
        (rows,cols,channels) = cv_image.shape
        if cols > 60 and rows > 60 :
            cv2.circle(cv_image, (60, 60), 30, (0,0,255), -1)

        # 显示Opencv格式的图像
        cv2.imshow("Image window", cv_image)
        cv2.waitKey(3)

第三步,opencv处理过的图像转化回为ROS图像信息,同时发布出去,发布后的图像信息可以通过ROS命令来查看。

self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))

分析完成,运行代码

roslaunch robot_vision usb_cam.launch
rosrun robot_vision cv_bridge_test.py
rqt_image_view

其中第二部如果是ROS—melodic版本肯定会报错,当然可以通过修改python版本声明来解决,用python2运行,但是现在python2已经被淘汰了,即使运行成功也毫无意义。

ROS报错:ROS-Melodic中cv_bridge报错_机械专业的计算机小白的博客-CSDN博客https://blog.csdn.net/wzfafabga/article/details/127239566?spm=1001.2014.3001.5502如上是解决这个问题的方法。

运行结果:

这是opencv输出的图像。

imgmsg_to_cv2,ROS,ros

 这是转化后并发布出的图像,其中话题名为cv_bridge_image,这在代码中有迹可查,而且符合逻辑。

imgmsg_to_cv2,ROS,ros

 这是原始图像,话题名为/usb_cam/image_raw,在代码中订阅者接收的图像数据类型消息。(rqt_image_view)

imgmsg_to_cv2,ROS,ros

 这是计算图(rqt_graph),其中只看见了两个节点

imgmsg_to_cv2,ROS,ros文章来源地址https://www.toymoban.com/news/detail-599364.html

到了这里,关于2.ROS机器视觉——ROS图像(imgmsg)与opencv(cv2)对接的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 我在Vscode学OpenCV 图像处理四(轮廓查找 cv2.findContours() cv2.drawContours())-- 待补充

    在OpenCV中,边缘检测和轮廓查找是两个不同的图像处理任务,它们有不同的目标和应用。 1.1.1 边缘检测: 定义: 边缘检测是指寻找图像中灰度级别变化明显的地方,即图像中物体之间的界限。这些变化通常表示图像中的边缘或轮廓。 方法: 常用的边缘检测算法包括Sobel、

    2024年02月03日
    浏览(61)
  • opencv-python[cv2]读取中文路径图像

    随着AI人工智能的不断发展,图像处理这门技术也越来越重要,很多学校本科都开启了图像处理这门课程,学习图像处理开发,自然就绕不开opencv-python[ cv2 ]这个由intel主导的开源库。 cv2 是指OpenCV的Python接口库。 OpenCV (Open Source Computer Vision Library)是一个开源的计算机视觉库

    2024年02月06日
    浏览(74)
  • opencv-25 图像几何变换04- 透视 cv2.warpPerspective()

    透视是一种几何学概念,用于描述在三维空间中观察物体时,由于视角的不同而产生的变形效果。在现实世界中,当我们从不同的角度或位置观察物体时,它们会呈现出不同的形状和大小。这种现象被称为透视效果。 透视效果主要由以下几个因素造成: 远近关系 :在视野范

    2024年02月15日
    浏览(51)
  • opencv-24 图像几何变换03-仿射-cv2.warpAffine()

    仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作。该变换能够 保持图像的平直性和平行性。平直性是指图像经过仿射变换后,直线仍然是直线;平行性是指 图像在完成仿射变换后,平行线仍然是平行线。 OpenCV 中的仿射函数为 cv2.warpAffine(),其通过

    2024年02月15日
    浏览(45)
  • opencv-23 图像几何变换02-翻转-cv2.flip()

    在 OpenCV 中,图像的翻转采用函数 cv2.flip()实现 ,该函数能够实现图像在水平方向翻转、垂直方向翻转、两个方向同时翻转,其语法结构为: 式中:  dst 代表和原始图像具有同样大小、类型的目标图像。  src 代表要处理的原始图像。  flipCode 代表旋转类型。该参数的意

    2024年02月15日
    浏览(53)
  • 【Opencv--自适应图像二值化】cv2.adaptiveThreshold()

    在这里 cv2.threshold函数 介绍了普通的opencv图像阈值处理函数。但threshold 的图像阈值处理对于某些光照不均的图像,这种全局阈值分割的方法并不能得到好的效果。 图像阈值化操作中,我们更关心的是从二值化图像中分离目标区域和背景区域,仅仅通过固定阈值很难达到理想

    2024年02月07日
    浏览(42)
  • 使用OpenCV的cv2.imread函数读取图像介绍

    在计算机视觉和图像处理应用中,读取图像是一个常见的操作。OpenCV是一个广泛使用的图像处理库,它提供了 cv2.imread 函数,用于读取图像。本文将详细介绍如何使用 cv2.imread 函数,包括参数和用法。 首先,确保你已经安装了OpenCV库。你可以使用以下命令来安装OpenCV(如果尚

    2024年02月05日
    浏览(74)
  • Opencv之图像滤波:5.中值滤波(cv2.medianBlur)

            之前介绍的均值滤波、方框滤波、高斯滤波,都是线性滤波方式。由于线性滤波的结果是所有像素值的线性组合,因此含有噪声的像素也会被考虑进去,噪声不会被消除,而是以更柔和的方式存在。这时使用非线性滤波效果可能会更好。中值滤波与前面介绍的滤波

    2024年02月06日
    浏览(51)
  • Python OpenCV 图像缩放:使用 cv2.resize() 方法

    图像缩放是计算机视觉和图像处理中常用的操作之一。OpenCV 是一个强大的计算机视觉库,提供了许多图像处理功能。在 Python 中使用 OpenCV 进行图像缩放非常简单,可以使用 cv2.resize() 方法来实现。 cv2.resize() 方法可以根据指定的尺寸调整图像的大小。它可以缩小图像,也可以

    2024年02月02日
    浏览(62)
  • OpenCV: 图像缩放(cv2.resize)【一分钟弄清楚】

    OpenCV: 图像缩放(cv2.resize)【一分钟弄清楚】 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 👈 希望得到您的订阅和支持~ 💡 创作高质量博文,分享更多关于深度学习、PyTorch、Python领域的优质

    2024年04月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包