近期需要处理一批Lidar+image的数据,拿到的是其他格式,但要转存成rosbag使用,参考部分网上做法,完成并记录。

1.Lidar处理

  主要是将Lidar点云信息按点转为pcl::PointXYZI,再将其用pcl::toROSMsg(mypoints, ros_Lidar_msg)转换成rosmsg,然后使用bag.write()。

2.Image处理

  使用cv_bridge::CvImage ros_image作为中介,然后ros_image.toImageMsg()转换成rosmsg,再使用bag.write()。

下述代码为对已匹配好的img+lidar按帧写成bag,部分代码冗余,供参考。

int main(int argc, char **argv)
{
if (argc < ) {
fprintf(stderr, "usage: read_log <logfile> <savepath>\n");
return ;
} // Open the log file.
vector<string> vecImgTimeName; string strTimestampfile = argv[];
string strLidarPath = strTimestampfile + "/lidar_data_reader/";
string strImagePath = strTimestampfile + "/img_data_reader/";
getDirFiles(strImagePath,vecImgTimeName,".jpg");
sort(vecImgTimeName.begin(), vecImgTimeName.end()); ros::Time::init();
std::string output_dir = argv[];
cout << "begin to subscribe" << endl; pcl::PointCloud<pcl::PointXYZI> points;
const size_t kMaxNumberOfPoints = 1e6; // From Readme for raw files.
points.clear();
points.reserve(kMaxNumberOfPoints);
rosbag::Bag bag;
bag.open(output_dir + "/res.bag", rosbag::bagmode::Write);
int imageCount = ;
int seq = ; for(vector<string>::iterator it=vecImgTimeName.begin();it!=vecImgTimeName.end();it++)
{
string tmp = *it;
string strLidarFile = strLidarPath + tmp + ".txt";
string strImgFile = strImagePath + tmp + ".jpg";
cout<<"Lidar : "<<strLidarFile<<endl;
cout<<"Image : "<<strImgFile<<endl;
cv::Mat img;
vector<LidarPoint> lidar_pts;
try {
img = cv::imread(strImgFile);
if (img.empty())
throw(img);
readLidarPts(strLidarFile, lidar_pts);
if (lidar_pts.empty())
throw(lidar_pts);
} catch (const cv::Mat &) {
cerr << "[Fatal Error] Failed to load image. Check for Path." << endl;
} catch (const std::vector<LidarPoint> &) {
cerr << "[Fatal Error] Failed to load LiDAR points. Check for Path."<< endl;
} pcl::PointCloud<pcl::PointXYZI> mypoints;
sensor_msgs::PointCloud2 ros_Lidar_msg;
cv_bridge::CvImage ros_image;
sensor_msgs::ImagePtr ros_image_msg;
for(vector<LidarPoint>::iterator iter = lidar_pts.begin();iter!=lidar_pts.end();iter++)
{
LidarPoint temp = *iter;
PointXYZI point;
float x = temp.x;
float y = temp.y;
float z = temp.z;
int32_t intensity = temp.r;
if(abs(x)<)
{
point.x = x;
point.y = y;
point.z = z;
point.intensity = intensity;
}
else
{
x=,y=,z=;
point.x = x;
point.y = y;
point.z = z;
point.intensity = intensity;
}
mypoints.push_back(point); }
ros::Time timestamp_ros = ros::Time::now();
pcl_conversions::toPCL(ros::Time::now(), mypoints.header.stamp);
mypoints.header.frame_id = "velodyne";
pcl::toROSMsg(mypoints, ros_Lidar_msg);
ros_Lidar_msg.header.stamp = timestamp_ros;
ros_Lidar_msg.header.frame_id = "velodyne_points"; ros_image.image = img;
ros_image.encoding = "bgr";
//cout<<"debug_______"<<endl;
ros::Time timestamp_ros2 = ros::Time::now();
ros_image_msg = ros_image.toImageMsg();
ros_image_msg->header.seq = seq;
ros_image_msg->header.stamp = timestamp_ros2;
ros_image_msg->header.frame_id = "image";
seq++; bag.write("points_raw", ros_Lidar_msg.header.stamp, ros_Lidar_msg);
bag.write("image_converter/cam1", ros_Lidar_msg.header.stamp, ros_image_msg);
cout<<"write one frame: "<<seq<<endl; }
printf("done\n");
return ;
}

C++图像加Lidar点云转写rosbag的更多相关文章

  1. 如何使用ArcGIS发布LiDAR 点云

    LiDAR--Light Detection And Ranging,即激光探测与测量技术. 下面将介绍如何使用ARCGIS来发布LiDAR的成果点云数据. LiDAR的点云数据一般格式为LAS.在A ...

  2. Tomcat 加腾讯云 实现二级域名访问

    搬家这个时间段不能用,从原网站https://blog.csdn.net/qq_36570464/article/details/86157394 截图过来的.也是自己写的. Tomcat 加腾讯云实 ...

  3. Python 通过 .cube LUT 文件对图像加滤镜

    Python 通过 .cube LUT 文件对图像加滤镜 一个好用的python给图片加滤镜的代码: https://github.com/CKboss/PyApplyLUT 这个是对C++代码的封装 ...

  4. python实现图像加载与保存,窗口创建与销毁,图片常用属性,ROI,通道的分离与合并,对比度和亮度

    目录: (一)图像加载与保存 (二)图像显示窗口创建与销毁 (三)图片的常用属性的获取 (四)生成指定大小的矩形区域(ROI) (五)图片颜色通道的分离与合并 (六)两张图片相加,改变对比度和亮度 ( ...

  5. 用matlab给图像加高斯噪声和椒盐噪声(不调用imnoise函数)

    图像画面中的噪声,大致可以分为两类:高斯噪声和椒盐噪声.在这里,我们先看下图像中两种噪声各自的特征. 椒盐噪声:噪声幅值基本相同,但出现位置随机. 高斯噪声:图像中每一点都存在噪声,但幅值是随机分布的 ...

  6. 跟我一起学opencv 第一课之图像加载,修改,保存

    使用opencv前记得引入库和头文件: #include<opencv2\opencv.hpp> 1.加载图像(cv::imread)(OPENCV 支持 JPG,PNG,TIFF等常见格 ...

  7. 【OpenCV学习笔记之一】图像加载,修改及保存

    加载图像(用cv::imread)imread功能是加载图像文件成为一个Mat对象 其中第一个参数表示图像文件名称第二个参数 表示加载的图像是什么类型 支持常见的三个参数值IMREAD_UNCHANG ...

  8. [Swift通天遁地]五、高级扩展-(11)图像加载Loading动画效果的自定义和缓存

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  9. OpenCV图像加载与保存

    OpenCV中的图像加载与保存 头文件是包含的库,在GitHub上下载的 imread("图片路径",图片加载方式) 图片加载方式: IMREAD_GRAYSCALE 灰度图像 I ...

随机推荐

  1. Java学习笔记之基础语法(数据类型)

    8种基本数据类型    整型:   byte[1字节]          short[2字节]        int[4字节]         long[8字节]      1,四种整型之间的区别:申 ...

  2. MSSQL提权之xp_cmdshell

    0x01 前提 getshell或者存在sql注入并且能够执行命令. sql server是system权限,sql server默认就是system权限. 0x02 xp_cmdshell 有了xp ...

  3. POJ2828 Buy Tickets 树状数组

    Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...

  4. Tensorflow从开始到放弃(技术篇)

    在gpu中运行 tf.device("/gpu:1") 有时候这个是会出问题的,即便你在有名称为1的gpu时.有的操作是不能支持gpu的,应该为session添加一些配置: pyt ...

  5. ESP8266开发之旅 进阶篇② 闲聊Arduino IDE For ESP8266烧录配置

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  6. vue.js 使用 vue-router 修改页面标题

    module.exports = { name: 'myComponent', data: {} route{ data: function(){ document.title = "页面标 ...

  7. C语言算法动态规划板子题汇总

    本篇博客仅为对动态规划基础问题的状态转移方程进行求解,然后给出对应的注释代码,有关题目的具体内容可在算法导论或网络上进行查看 目录 1.钢管切割(最小值) 2.两条流水线调度 3.多条流水线调度 4. ...

  8. Java基础(三十二)JDBC(2)连接数据库

    一.连接数据库的过程 连接数据库的过程:加载数据库驱动程序,不过只需在第一次访问数据库时加载一次,然后在每次访问数据库时创建一个Connection实例,然后执行操作数据库的SQL语句,并返回执行结果 ...

  9. JavaScript中instanceof的判断依据

    读jquery源码的时候,发现作者为了让创建jquery对象更容易使用了用函数返回对象的方法 jQuery = function( selector, context ) { return new j ...

  10. Linux 编译与交叉编译

    在Linux环境中,所处平台不同,执行文件也就不同,同一执行文件不能在不同平台下使用 如在Ubnutu下 是用gcc编译一个.c文件 gcc main.c -o main.out -o 可以指定输出文 ...