C++图像加Lidar点云转写rosbag
近期需要处理一批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的更多相关文章
- 如何使用ArcGIS发布LiDAR 点云
LiDAR--Light Detection And Ranging,即激光探测与测量技术. 下面将介绍如何使用ARCGIS来发布LiDAR的成果点云数据. LiDAR的点云数据一般格式为LAS.在A ...
- Tomcat 加腾讯云 实现二级域名访问
搬家这个时间段不能用,从原网站https://blog.csdn.net/qq_36570464/article/details/86157394 截图过来的.也是自己写的. Tomcat 加腾讯云实 ...
- Python 通过 .cube LUT 文件对图像加滤镜
Python 通过 .cube LUT 文件对图像加滤镜 一个好用的python给图片加滤镜的代码: https://github.com/CKboss/PyApplyLUT 这个是对C++代码的封装 ...
- python实现图像加载与保存,窗口创建与销毁,图片常用属性,ROI,通道的分离与合并,对比度和亮度
目录: (一)图像加载与保存 (二)图像显示窗口创建与销毁 (三)图片的常用属性的获取 (四)生成指定大小的矩形区域(ROI) (五)图片颜色通道的分离与合并 (六)两张图片相加,改变对比度和亮度 ( ...
- 用matlab给图像加高斯噪声和椒盐噪声(不调用imnoise函数)
图像画面中的噪声,大致可以分为两类:高斯噪声和椒盐噪声.在这里,我们先看下图像中两种噪声各自的特征. 椒盐噪声:噪声幅值基本相同,但出现位置随机. 高斯噪声:图像中每一点都存在噪声,但幅值是随机分布的 ...
- 跟我一起学opencv 第一课之图像加载,修改,保存
使用opencv前记得引入库和头文件: #include<opencv2\opencv.hpp> 1.加载图像(cv::imread)(OPENCV 支持 JPG,PNG,TIFF等常见格 ...
- 【OpenCV学习笔记之一】图像加载,修改及保存
加载图像(用cv::imread)imread功能是加载图像文件成为一个Mat对象 其中第一个参数表示图像文件名称第二个参数 表示加载的图像是什么类型 支持常见的三个参数值IMREAD_UNCHANG ...
- [Swift通天遁地]五、高级扩展-(11)图像加载Loading动画效果的自定义和缓存
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- OpenCV图像加载与保存
OpenCV中的图像加载与保存 头文件是包含的库,在GitHub上下载的 imread("图片路径",图片加载方式) 图片加载方式: IMREAD_GRAYSCALE 灰度图像 I ...
随机推荐
- Struts2:搭建原理
记录下,struts2的搭建过程: 1核心jar包: struts-2.1.8\apps\struts2-blank-2.1.8.war 解压后 在struts2-blank-2.1.8\WEB-IN ...
- 生产环境中利用软链接避免"rm -rf /"的方法
1.将系统中的rm二进制文件重命名为rm_real:2.编写脚本rm_shell,rm_shell中主要包含以下内容: 2.1)路径转换模块,用于将rm_shell参数中的路径转换为绝对路径 ...
- css3实现饼状图进度及环形进度条
1 <!-- 饼图 --> <div class="pie"></div> <hr /> <!-- 环形图 --> &l ...
- 如何把应用程序移植到k8s
程序部署环境的容器化已经是大势所趋,微服务为容器化提供了广阔的应用舞台,k8s已经把Docker纳入为它的底层支撑容器引擎,一统江湖,成为了容器技术事实上的标准.一般的应用程序是不能直接拿来部署到容器 ...
- 关于托福改革后的难度、评分和拼分,听听ETS的老师怎么说
“笔者有幸于几天前去到ETS位于普林斯顿的总部学习,聆听了他们关于托福考试的发展和变革的说明,在这里向大家汇报一下此行的收获.” 当从车上下来那一刻起,我们便被那辽阔的绿草地和宜人的风景所吸引,伴随着 ...
- 百万年薪python之路 -- 并发编程之 多线程 二
1. 死锁现象与递归锁 进程也有死锁与递归锁,进程的死锁和递归锁与线程的死锁递归锁同理. 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因为争夺资源而造成的一种互相等待的现象,在无外力的作用 ...
- linux端口查询
常用端口 下面的表格中列举了包括在红帽企业 Linux 中的服务.守护进程.和程序所使用的最常见的通信端口.该列表还可以在 /etc/services 文件中找到.要查看由互联网号码分派局(IANA) ...
- Java多线程编程(五)定时器Timer
一.定时器Timer的使用 在JDK库中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务.Timer类的主要作用就是设置计划任务,但封装任务的类确实TimerTask类,执行计 ...
- json基本内容
json的基本信息和历史 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于欧洲计算机协会制定的js规范的一个子集,采用完全独立于编程语言的文本格式来 ...
- SpringBoot配置文件之Yml语法
一 使用 YAML 而不是 Properties YAML是 JSON 的超集,因此,它是用于指定分层配置数据的便捷格式.只要 class 路径上有SnakeYAML library,SpringAp ...