某些情况下需要录图像数据的包,非常占空间和带宽,尤其对于一些工业相机图像一张好几兆,每秒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为例,话题为:
所以,在launch命令中,“压缩图像话题”不要加“compressed”!!!
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
- 详细参考: