• ROS 与 OpenCv


    ROS安装opencv
    sudo apt-get install ros-kinetic-vision-opencv libopencv-dev python-opencv
     
    功能包下载: https://gitee.com/victorywr/source/tree/master/code_learning/robot_vision 
     
    ROS 图像数据与OpenCV数据格式的桥梁:CvBridge
    roslaunch robot_vision/launch/usb_cam.launch
     
    可能报错 [ WARN] [1643215244.519801181]: sh: 1: v4l2-ctl: not found
    0
    需要安装v4l2 sudo apt-get install v4l-utils
     
     
    然后重新运行
    roslaunch robot_vision/launch/usb_cam.launch
    只是一些参数的配置声明
    #usb_cam.launch
    <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>
     
    此时摄像头虽然亮着,但是是没有画面的,需要继续打开一个终端执行下面这个脚本
    rosrun robot_vision cv_bridge_test.py
    执行rosrun robot_vision cv_bridge_test.py可能遇到如下情况
    提示没有执行权限或文件不存在,可此时文件是存在的,所以需要修改添加相关文件的可执行权限
    输入如下指令:chmod +x cv_bridge_test.py
    0
     
     
    然后就能看到画面了
    0
     
     
    再输入如下指令
    rqt_image_view
    可以看到出现两个画面框,两者的关系是
    左边是通过Cv_Bridge 将ROS图像转化成opencv图像数据后在图像左上角画了一个圆
    右边是opencv将图像数据再次通过cv_bridge 转化成ROS图像数据的显示。
    0
     
     
    Code 实现原理
    导入相关库
    0
     
     
    定义发布者与订阅者
    0
    订阅者订阅话题 /usb_cam/image_raw 的消息,消息类型是 Image (实际是from sensor_msgs.msg import Image) 关于image消息的类型定义可参考 ros调用摄像头
    订阅者接受到消息数据后调用回调函数 callback
     

    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()

     
    bridge.imgmsg_to_cv2 将ROS的图像数据格式转化成Opencv的图像数据格式
    转化后调用Opencv的库在原图上画一个圆 cv2.circle(cv_image, (60, 60), 30, (0,0,255), -1)
     
    最后通过发布者将处理过 bridge.cv2_to_imgmsg 接口函数 将Opencv数据图转化为ROS的图像数据格式再发布到系统中,如下可以看到发布者 发布的话题 cv_bridge_image
     
     
     
  • 相关阅读:
    Thinkphp5+PHPExcel实现批量上传表格数据
    使用ECharts画K线图
    ThinkPHP5+Layui实现图片上传加预览
    SVN使用教程总结
    JS内置对象方法
    头像上传【实用php】
    Sublime Text 3 快捷键总结
    javascript--基础 三元表达式
    javascript---运算符、表达式、递增、比较运算符、逻辑运算符
    导入dmp的sql语句
  • 原文地址:https://www.cnblogs.com/victorywr/p/15854211.html
Copyright © 2020-2023  润新知