近期需要处理一批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. 渗透测试-基于白名单执行payload--Csc

    复现亮神课程 基于白名单执行payload--csc 0x01 Csc.exe C#的在Windows平台下的编译器名称是Csc.exe,如果你的.NET FrameWork SDK安装在C盘,那么你 ...

  2. opencv::直方图计算

    直方图概念 上述直方图概念是基于图像像素值,其实对图像梯度.每个像素的角度.等一切图像的属性值,我们都可以建立直方图.        这个才是直方图的概念真正意义,不过是基于图像像素灰度直方图是最常见 ...

  3. 百万年薪python之路 -- 包

    包 使用import 和from xx import xx 现有如下结构 bake ├── __init__.py ├── api ├── __init__.py ├── policy.py └── ...

  4. 《利用Python进行数据分析·第2版》第四章 Numpy基础:数组和矢量计算

    <利用Python进行数据分析·第2版>第四章 Numpy基础:数组和矢量计算 numpy高效处理大数组的数据原因: numpy是在一个连续的内存块中存储数据,独立于其他python内置对 ...

  5. 闪讯 开启wifi教程

    这是我自己试了几次之后发现的,也不是什么技术活. 首先说下,我的比较是小米pro笔记本,一般笔记本都是自带wifi功能的.如果要开wifi的话,必须是用网线连接才可以,通过wifi连接网络就不能开移动 ...

  6. SpringMVC重点知识总结

    SpringMVC总结 1. SpringMVC简介 MVC即模型-视图-控制器(Model-View-Controller) Spring Web MVC是一种基于Java的实现了Web MVC设计 ...

  7. webpack 4.x 初级学习记录

    首先声明下,本人不擅长文字表达,文采不行,所以文章中文字较少,请看代码,初级学习,不足之处请多多指教 GitHub链接 看云kancloud [TOC] webpack 4.x 安装 首先需要在全局中 ...

  8. Java基础(二十一)集合(3)List集合

    一.List接口 List集合为列表类型,列表的主要特征是以线性方式存储对象. 1.实例化List集合 List接口的常用实现类有ArrayList和LinkedList,根据实际需要可以使用两种方式 ...

  9. git push 报src refspec xxx does not match any的错误

    今天在向一个新的远程分支上推送项目的时候报错: 远程分支branch_new是其他人建的,我在自己本地修改后把自己分支的修改推送到这个远程分支上. 把修改提到本地仓库: git add ./ git ...

  10. java常用类Time

    LocalDate:IOS格式(yyyy-MM-dd)日期 LocalTime:表示一个时间 LocalDateTime:表示时间日期 Instant 时间线上的瞬时点,可以用来记录应用程序中的时间时 ...