压缩图像sensor_msgs/CompressedImag

某些情况下需要录图像数据的包,非常占空间和带宽,尤其对于一些工业相机图像一张好几兆,每秒30帧的话一份钟好几个G,这时候可以选择的订阅压缩图像;

  • 但是,在一般的视觉框架中,都是直接处理“未压缩图像”,所以在使用的时候,需要对图像先解压缩,再使用;

压缩图像使用步骤

方法一:更改ROS回调函数

  • Step1:通常的视觉框架使用的ROS图像话题格式:sensor_msgs::ImageConstPtr
void img_callback(const sensor_msgs::ImageConstPtr &img_msg)

但是,压缩图像的ROS图像话题格式:sensor_msgs::CompressedImageConstPtr

所以,必须将CompressedImageConstPtr转为ImageConstPtr;

  • Step2:回调函数改为sensor_msgs::CompressedImageConstPtr,即sensor_msgs::CompressedImageConstPtr转为cv::Mat
void ImageGrabber::GrabImage2(const sensor_msgs::CompressedImageConstPtr& msg)
{
    cv::Mat cv_ptr;

    // * 添加压缩图像接口
        try
    {
        // * ROS消息格式转cv::Mat
        cv_bridge::CvImagePtr cv_ptr_compressed = cv_bridge::toCvCopy(msg,sensor_msgs::image_encodings::BGR8);
        cv_ptr = cv_ptr_compressed->image;
    }
    catch (cv_bridge::Exception& e)
    {
//        ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());
    }

    //单目模式跟踪特征点
    mpSLAM->TrackMonocular(cv_ptr,msg->header.stamp.toSec());
}
  • Step3:但是,sensor_msgs::ImageConstPtr和sensor_msgs::CompressedImageConstPtr有一些数据格式不同,以VINS-Mono为例,VINS-Mono中用到了很多sensor_msgs::ImageConstPtr的数据结构,但是sensor_msgs::CompressedImageConstPtr中没有对应的结构!
  • Step4:因此,方案一在某些情况下,不一定可以用;
  • 参考

方案二:

  • 在luanch文件中,添加命令:
       <!-- Image conversion -->
- <node name="republish0" type="republish" pkg="image_transport" output="screen" args="compressed in:=/camera/image_raw raw out:=/camera/image_raw" />

以LVI-SAM的handheld.bag为例,话题为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z40uloXh-1674551736076)(https://secure2.wostatic.cn/static/sYBa1eDe7rUYevBov1rLN6/image.png?auth_key=1674551725-38xD4yNBNXYJ2ULSQF8q3g-0-178cdf324b336e9b713c07d607a39445)]

所以,在launch命令中,“压缩图像话题”不要加“compressed”!!!

https://blog.csdn.net/weixin_30457881/article/details/98023948?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165871721216782246466979%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165871721216782246466979&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-2-98023948-null-null.142v33experiment_2_v1,185v2control&utm_term=%20%3Cnode%20pkg%3Dimage_transport%20type%3Drepublish%20name%3D%24%28arg%20project%29_republish%20&spm=1018.2226.3001.4187

https://www.cnblogs.com/hong2016/p/7616174.html

  • 但是,以ORB-SLAM为例,没有launch文件!
    • 所以,使用rosrun的方式,启动image_transport节点!(image_transport是一个包,需要安装才可以使用)
    • 例子:
rosrun image_transport republish compressed in:=/usb_cam150/image_raw raw out:=/usb_cam150/image_raw
- 详细参考:

https://blog.csdn.net/qq_25458977/article/details/107990439?ops_request_misc=&request_id=&biz_id=102&utm_term=rosrun%E5%90%AF%E5%8A%A8image_transport&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-107990439.142v33experiment_2_v1,185v2control&spm=1018.2226.3001.4187

猜你喜欢

转载自blog.csdn.net/m0_46905397/article/details/128757214
今日推荐