某些情况下需要录图像数据的包,非常占空间和带宽,尤其对于一些工业相机图像一张好几兆,每秒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://blog.csdn.net/hxlanu/article/details/123747430?ops_request_misc=&request_id=&biz_id=102&utm_term=%20%3Cnode%20pkg=%22image_transport%22%20t&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-123747430.142v33experiment_2_v1,185v2control&spm=1018.2226.3001.4187
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文章来源:https://www.toymoban.com/news/detail-503471.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文章来源地址https://www.toymoban.com/news/detail-503471.html
到了这里,关于压缩图像sensor_msgs/CompressedImag的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!