ros-双目图像数据发布

ros发布图像数据

1.简介

最近项目需要读取双目相机获取图像数据并发布出来,做个简单记录

2.完整代码

并没有什么原理性的东西,就是调用opencv的API启动相机读取图像数据,然后嵌套进ros框架中

#include<iostream>

#include<ros/ros.h>

#include<opencv2/highgui.hpp>
#include<opencv2/imgcodecs.hpp>
#include<opencv2/imgproc.hpp>

#include<std_msgs/Header.h>
#include<cv_bridge/cv_bridge.h>
#include<sensor_msgs/image_encodings.h>
#include<image_transport/image_transport.h>

int main(int argc, char **argv)
{
    /* 节点初始化 */
    ros::init(argc, argv, "usb_cam");
    /* 句柄初始化 */
    ros::NodeHandle nh;
    image_transport::ImageTransport it(nh);

    /* 频率设置 */
    ros::Rate loop_rate(20);

    /* 定义两个发布者 */
    image_transport::Publisher pub_left = it.advertise("/camera/left/image_raw", 20);
    image_transport::Publisher pub_right = it.advertise("/camera/right/image_raw", 20);

    /* 定义图像变量(opencv) */
    cv::Mat imgl, imgr, frame;
    sensor_msgs::ImagePtr msgl, msgr;

    /* 打开相机 */
    std::cout<<"初始化相机"<<std::endl;
    cv::VideoCapture cap(0);
    std::cout<<"完成相机初始化"<<std::endl;
    cap.set(cv::CAP_PROP_FRAME_WIDTH, 2560);
    cap.set(cv::CAP_PROP_FRAME_HEIGHT, 720);
    cap.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));


    if (!cap.isOpened())
    {
        std::cout<<"相机未打开!"<<std::endl;
        return 0;
    }
    else
    {
        std::cout<<"相机打开!"<<std::endl;
    }
    

    while (nh.ok())
    {
        /* 读取相机视频流 */
        cap.read(frame);
        if (frame.empty())
        {
            std::cout<<"未读取到视频数据"<<std::endl;
            continue;
        }
        
        /* 分割图像 */
        imgl = frame(cv::Rect(0, 0, 1280, 720));
        imgr = frame(cv::Rect(1280, 0, 1280, 720));

        /* opencv转换ros图像数据 */
        msgl = cv_bridge::CvImage(std_msgs::Header(), "bgr8", imgl).toImageMsg();
        msgr = cv_bridge::CvImage(std_msgs::Header(), "bgr8", imgr).toImageMsg();

        /* 发布数据 */
        pub_left.publish(msgl);
        pub_right.publish(msgr);

        ros::spinOnce();
        loop_rate.sleep();
    }
    
    return 0;
}

好哥哥们,如果有帮助请点个赞呀!

### ZED ROS Wrapper 文档与教程 ZED ROS Wrapper 是 Stereolabs 提供的一个用于集成其 ZED 双目摄像头系列到机器人操作系统 (ROS) 的工具包。它支持多种功能,包括实时深度感知、SLAM 映射以及回放录制的 `.svo` 文件。 #### 启动 ZED-M 设备并加载 SVO 文件 对于 ZED-M 型号设备,可以通过以下命令启动驱动程序并将指定路径下的 `.svo` 文件作为输入源[^1]: ```bash roslaunch zed_wrapper zedm.launch svo_file:=/path/to/file.svo ``` 此命令会初始化 `zedm.launch` 配置文件,并通过参数传递 `.svo` 文件的位置。`.svo` 文件是由 ZED SDK 录制的数据流,可以离线重播以便调试或分析。 #### 使用 ROS 2 启动 ZED 节点 如果正在使用 ROS 2,则需采用 Python Launch 文件来配置和启动 ZED 组件节点。以下是针对不同型号设备的启动方式[^2]: - **标准分辨率模式** ```bash ros2 launch zed_wrapper zedx.launch.py ``` - **高精度模式(适用于 ZED-XM 或其他高级版本)** ```bash ros2 launch zed_wrapper zedxm.launch.py ``` 上述命令分别对应于不同的硬件规格及其优化设置。值得注意的是,在 ROS 2 中,这些组件还可以被动态加载至系统级容器中以降低通信开销。 #### 官方文档链接 Stereolabs 提供详尽的技术手册帮助开发者快速上手: - [ZED ROS Wrapper Documentation](https://docs.stereolabs.com/ros/) - [Getting Started with ZED and ROS](https://www.stereolabs.com/docs/ros/installation/) 此外还有专门面向初学者的基础教学视频可供参考学习如何安装部署环境及编写自定义脚本处理传感器数据。 #### 示例代码片段展示订阅话题获取图像帧的方法 下面是一个简单的 Python 脚本例子说明怎样从 `/zed_camera/left/image_rect_color` 主题读取左眼彩色图象消息: ```python import rospy from sensor_msgs.msg import Image from cv_bridge import CvBridge, CvBridgeError def image_callback(msg): try: bridge = CvBridge() frame = bridge.imgmsg_to_cv2(msg, desired_encoding="bgr8") # Process the OpenCV format 'frame' here... except CvBridgeError as e: print(e) if __name__ == '__main__': rospy.init_node('image_subscriber', anonymous=True) sub = rospy.Subscriber('/zed_camera/left/image_rect_color', Image, image_callback) rospy.spin() ``` 该样例利用了 `cv_bridge` 库转换 ROS 图像消息成便于操作的标准 NumPy 数组形式,从而允许进一步应用计算机视觉算法库比如 OpenCV 进行后续计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值