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 ...
随机推荐
- luoguP2144 [FJOI2007]轮状病毒
题目描述 求 nnn 个点的生成树个数. Solution 2144\text{Solution 2144}Solution 2144 打表得 1=125=5×1216=4245=5×32121=11 ...
- opencv实践::切边
问题描述 真实案例,扫描仪扫描到的法律文件,需要切边,去掉边 缘空白,这样看上去才真实. #include <opencv2/opencv.hpp> #include <iostre ...
- 04jmeter-Concurrency Thread Group
1.下载插件Custom Thread Groups:参照:00jmeter安装相关 2.添加并发线程组 场景举例: 10个线程2分钟的加速时间5个加速步骤持有目标速率2分钟: 即: 2分钟除以5步, ...
- Dell R720 RAID配置
Dell服务器上一般都带有Raid卡,Raid5配置请看下边,亲们 1. 将服务器接上电源,显示器,键盘,并开机 2. 按 ctrl + R进入Raid设置 3. 将光标放置在Raid卡那,按F2,选 ...
- 徐明星系列之徐明星创办的OK资本成为RnF金融有限公司的锚定投资者
12月17日,由区块链专家徐明星创办的OK集团的投资部门OK资本宣布,它将成为RnF金融有限公司的锚定投资者.OK集团成立于2012年,创始人徐明星是前豆丁网CTO,从豆丁网离职后,徐明星创办了OK集 ...
- Lambda函数及其用法
Lambda函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行? 当然可以啦.有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可. 先来看个简单lambda函 ...
- 刷14道leetcode的总结
引子 为什么我要刷leetcode?换工作?不是!那是?玩!巴菲特的双目标清单系统,基本方法是列两个清单,一个是职业生涯最重要的目标(不超过5个),另一个是比较重要的目标.对于比较重要的目标,要像躲避 ...
- CentOS6.6-MySQL报Curses library not found
cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.40 \> -DMYSQL_DATADIR=/application/mysql-5. ...
- 【java基础】- java双亲委派机制
在了解双亲委派机制之前,你应当知道classloader(如果不了解,可以现在去恶补一下哈) 四种classloader 虚拟机自带 引导类加载器(Bootstrap ClassLoader) 扩展类 ...
- 如何在Idea中编译构建Spring Framework 5.x
如何在Idea中编译构建Spring Framework 5.x 安装配置Gradle(略) 下载源码:git clone https://github.com/spring-projects/spr ...