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 ...
随机推荐
- java中的静态
static静态 public static void main 类只是用来存储和被调用的,而对象是需要执行的,执行时就必定需要知道程序的入口,这个入口就是由main所在的位置. Java的类中没有m ...
- RF中for循环
robotframework支持FOR循环语句,语法和Python的语法基本相同,但robotframework中,“FOR”关键字前面需要增加一个“:”,写成“:FOR”,其它与Python的语法相 ...
- python selenium下拉框定位
一.前言 总结一下python+selenium select下拉选择框定位处理的两种方式,以备后续使用时查询: 二.直接定位(XPath) 使用Firebug找到需要定位到的元素,直接右键复制XPa ...
- 攻防世界(XCTF)WEB(进阶区)write up(四)
ics-07 Web_php_include Zhuanxv Web_python_template_injection ics-07 题前半部分是php弱类型 这段说当传入的id值浮点值不能为1 ...
- cobalt strike批量发送钓鱼邮件
0×01 利用Cobalt strike生成木马 这里我们生成木马可以用cs带的HTA.OFFICE宏.word宏来使目标上线cs,这里以word宏病毒为例子. 首先我们需要制作一个word宏病毒来进 ...
- opencv::SURF特征
SURF特征基本介绍 SURF(Speeded Up Robust Features)特征关键特性: -特征检测 -尺度空间 -选择不变性 -特征向量 工作原理 . 选择图像中POI(Points o ...
- 常用函数-Time
#pragma pack(push,1) /* 在这中间定义的结构体,已单字节对齐 */ #pragma pack(pop) /************************************ ...
- Mysql面试题及千万级数据查询优化
今天在说Mysql查询优化之前,我先说一个常见的面试题,并带着问题深入探讨研究.这样会让大家有更深入的理解. 一,Mysql数据库中一个表里有一千多万条数据,怎么快速的查出第900万条后的100条数据 ...
- .NET进阶篇04-Serialize序列化、加密解密
知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂这篇很轻松,没有什么费脑子的,所以解析较少,代码较多,为数不多的拿来即用篇整个章节分布请移步 内容目录 一.概述二.序列化1.二进制文件2.XML ...
- restapi(8)- restapi-sql:用户自主的服务
学习函数式编程初衷是看到自己熟悉的oop编程语言和sql数据库在现代商业社会中前景暗淡,准备完全放弃windows技术栈转到分布式大数据技术领域的.但是在现实中理想总是不如人意,本来想在一个规模较小的 ...