ros-双目图像数据发布

ros发布图像数据

  • 1.简介
  • 2.完整代码

1.简介

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

2.完整代码

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

#include

#include

#include
#include
#include

#include
#include
#include
#include

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;
}

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

你可能感兴趣的:(进击的ROS,opencv,ros)