激光相机数据融合(5)--Gazebo仿真数据融合
这一节将用ROS+Gazebo 环境获取激光获取点云,并用PCL和OPENCV处理,源代码在:https://github.com/ZouCheng321/5_laser_camera_sim
由于激光的视角远大于相机,所以我们使用了5个相机来获取图像,这类似于Ladybug相机:


相机获取的五张图像:

接下来我们用来构建彩色点云:
相机与激光的位置变换,由于是正五边形分别,这很容易求得:
Eigen::Matrix4f rt0,rt1,rt2,rt3,rt4;
rt0<< ,,-,, ,,,, ,,,, ,,,;
rt1<< ,,-,, -0.95105651629,0.30901699437,,, 0.30901699437,0.95105651629,,, ,,,;
rt2 << ,,-,, -0.58778525229,-0.80901699437,,, -0.80901699437,0.58778525229,,, ,,,;
rt3 << ,,-,, 0.58778525229,-0.80901699437,,, -0.80901699437,-0.58778525229,,, ,,,;
rt4 << ,,-,, 0.95105651629,0.30901699437,,, 0.30901699437,-0.95105651629,,, ,,,;
Eigen::Matrix4f inv0,inv1,inv2,inv3,inv4;
inv0=rt0.inverse();
inv1=rt1.inverse();
inv2=rt2.inverse();
inv3=rt3.inverse();
inv4=rt4.inverse(); RT.push_back(rt0);
RT.push_back(rt1);
RT.push_back(rt2);
RT.push_back(rt3);
RT.push_back(rt4); INV.push_back(inv0);
INV.push_back(inv1);
INV.push_back(inv2);
INV.push_back(inv3);
INV.push_back(inv4);
相机的内参,已经在仿真软件中设定:
std::vector<cv::Point2d> imagePoints;
cv::Mat intrisicMat(, , cv::DataType<double>::type); // Intrisic matrix
intrisicMat.at<double>(, ) = 476.715669286;
intrisicMat.at<double>(, ) = ;
intrisicMat.at<double>(, ) = ;
intrisicMat.at<double>(, ) = ;
intrisicMat.at<double>(, ) = 476.715669286;
intrisicMat.at<double>(, ) = ;
intrisicMat.at<double>(, ) = ;
intrisicMat.at<double>(, ) = ;
intrisicMat.at<double>(, ) = ;
cv::Mat rVec(, , cv::DataType<double>::type); // Rotation vector
rVec.at<double>() = ;
rVec.at<double>() = ;
rVec.at<double>() = ;
cv::Mat tVec(, , cv::DataType<double>::type); // Translation vector
tVec.at<double>() = 0.4;
tVec.at<double>() = ;
tVec.at<double>() = -0.1;
cv::Mat distCoeffs(, , cv::DataType<double>::type); // Distortion vector
distCoeffs.at<double>() = ;
distCoeffs.at<double>() = ;
distCoeffs.at<double>() = ;
distCoeffs.at<double>() = ;
distCoeffs.at<double>() = ;
去除相机后方的点云:
std::vector<cv::Point3d> Generate3DPoints(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,int num)
{
std::vector<cv::Point3d> points;
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_f (new pcl::PointCloud<pcl::PointXYZ>); Eigen::Matrix4f TR;
TR << ,,-,, ,,,, ,,,, ,,,;
pcl::transformPointCloud (*cloud, *cloud_f, RT[num]); pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud (cloud_f);
pass.setFilterFieldName ("z");
pass.setFilterLimits (0.0, );
//pass.setFilterLimitsNegative (true);
pass.filter (*cloud);
cout<<"size:"<<cloud->size()<<endl; for(int i=;i<=cloud->points.size();i++)
{
points.push_back(cv::Point3d(cloud->points[i].x, cloud->points[i].y, cloud->points[i].z));
} return points;
}
将前方的点云投影到相机平面,这里直接用opencv自带的projectPoints函数:
cv::projectPoints(objectPoints, rVec, tVec, intrisicMat, distCoeffs, imagePoints);
保留图像内的点云:
for(int i=;i<imagePoints.size();i++)
{
if(imagePoints[i].x>=&&imagePoints[i].x<&&imagePoints[i].y>=&&imagePoints[i].y<)
{ pcl::PointXYZRGB point;
point.x = cloud->points[i].x;
point.y = cloud->points[i].y;
point.z = cloud->points[i].z;
point.r = _I(round(imagePoints[i].x),round(imagePoints[i].y))[];
point.g = _I(round(imagePoints[i].x),round(imagePoints[i].y))[];
point.b = _I(round(imagePoints[i].x),round(imagePoints[i].y))[]; colored_cloud->points.push_back (point);
}
}
最后显示所有点云:
pcl::visualization::PCLVisualizer viewer("Cloud viewer");
viewer.addPointCloud(colored_cloud_sum, "sample cloud");
viewer.setBackgroundColor(,,);
while(!viewer.wasStopped())
//while (!viewer->wasStopped ())
viewer.spinOnce();
要构建这个项目:
cd 5_laser_camera_sim
mkdir build
cd build
cmake ..
make
./color
将看到如下显示:

激光相机数据融合(5)--Gazebo仿真数据融合的更多相关文章
- 七牛云 融合CDN测试域名 -> 融合CDN加速域名
七牛云 融合CDN测试域名 -> 融合CDN加速域名 本篇主要讲解 如何将七牛云融合CDN测试域名 切换到自定义的加速域名上去,为什么会写这篇是因为我收到了一封 [七牛云]测试域名回收通知的邮件 ...
- 激光相机数据融合(4)--KITTI数据集中matlab接口说明及扩展
KITTI数据集接口已经提供了matlab接口,本篇将说明详细说明其应用并与PCL进行对接.PCL为C++点云处理语言库,详情可见:http://pointclouds.org/ 程序可以从官网下载, ...
- 激光相机数据融合(3)--KITTI数据集
KITTI数据集提供了双目图像,激光数据,和imu/gps位置信息,其中还包括了大量的算法.下载地址为:http://www.cvlibs.net/datasets/kitti/raw_data.ph ...
- 数据融合(data fusion)原理与方法
数据融合(data fusion)原理与方法 数据融合(data fusion)最早被应用于军事领域. 现在数据融合的主要应用领域有:多源影像复合.机器人和智能仪器系统.战场和无人驾驶飞机.图 ...
- IDM主机上安装融合应用程序配置框架
IDM主机上安装融合应用程序配置框架 安装Oracle融合应用程序>设置>身份和访问管理节点安装融合应用程序配置框架 由于我们使用Oracle VirtualBox虚拟机这一次,我们在 ...
- DirectX基础学习系列5 融合技术
7.1融合方程 1概念 融合技术将当前光栅化像素的颜色与以前已光栅化并处于同一个位置的像素颜色进行合成,即将当前要进行光栅化的三角形单元与已写入后台的像素进行融合 2需要遵循的原则: (1)先绘制不需 ...
- Gluon炼丹(Kaggle 120种狗分类,迁移学习加双模型融合)
这是在kaggle上的一个练习比赛,使用的是ImageNet数据集的子集. 注意,mxnet版本要高于0.12.1b2017112. 下载数据集. train.zip test.zip labels ...
- SSE图像算法优化系列二十九:基础的拉普拉斯金字塔融合用于改善图像增强中易出现的过增强问题(一)
拉普拉斯金字塔融合是多图融合相关算法里最简单和最容易实现的一种,我们在看网络上大部分的文章都是在拿那个苹果和橙子融合在一起,变成一个果橙的效果作为例子说明.在这方面确实融合的比较好.但是本文我们主要讲 ...
- GDAL多光谱与全色图像融合简单使用
目录 简述 C++代码 效果对比 GDAL融合效果和原始多光谱波段对比 GDAL融合效果和原始全色波段对比 ARCGIS融合效果与原始全色和多光谱对比 GDAL融合效果与ArcGIS融合效果对比 简述 ...
随机推荐
- css3制作网页中常见的小箭头
/* css3三角形(向上 ▲) */ div.arrow-up { width:0px; height:0px; border-left:5px solid transparent; /* 右透明 ...
- 小白学Maven第二篇配置Ecilpse
Maven:里面提到了一个很重要的概念:中央仓库,本地仓库,私服: 中央仓库:是Maven通过一个地址索引去(http://mvnrepository.com/)下载需要的架包: 本地仓库:是Mave ...
- SQL server 数据库备份大
首先简单的介绍一下Sql server 备份的类型有: 1:完整备份(所有的数据文件和部分的事务日志文件) 2:差异备份(最后一次完成备份后数据库改变的部分) 3:文件和文件组备份(对指定的文件和文件 ...
- Java策略模式以及来自lambda的优化
前言 设计模式是软件工程中一些问题的统一解决方案的模型,它的出现是为了解决一些普遍存在的,却不能被语言特性直接解决的问题,随着软件工程的发展,设计模式也会不断的进行更新,本文介绍的是经典设计模式 ...
- 搭建阿里云 centos mysql tomcat jdk
[toc] 阿里云使用centos 登录 http://www.aliyun.com/ 点击登录 进入控制 https://home.console.aliyun.com/ 云服务器 运行中 把ip输 ...
- pm2用法详解+ecosystem.config
对于后台进程的管理,常用的工具是crontab,可用于两种场景:定时任务和常驻脚本.关于常驻脚本,今天介绍一款更好用的工具:pm2,基于nodejs开发的进程管理器,适用于后台常驻脚本管理,同时对no ...
- 设置QT应用程序图标方法(Windows下)
学习笔记,言简意赅. 1- 新建文本文件,编辑输入 IDI_ICON1 ICON DISCARDABLE "./image/WindowIco.ico" 注意: ...
- 工信部:我国4G用户近9.5亿 用户平均使用流量近2G
刚刚沿着广场转了一圈,我竟发现自己离他只有几步之遥,又在那条人行道上,刚才催促我前进的自豪感突然之间被惊慌代替.陌生人看着我,脸上流露出一种遗憾的表情,他向我靠近,轻轻摇着脑袋,像是为某个不受人控制的 ...
- IDEA启动后页面没有tomcat server选项,显示灰色问号和红叉不能使用
说明:自己好几次硬盘莫名其妙读不出来导致电脑重启后idea没有了tomcat选项,原来的tomcat上显示灰色的问号和红色小叉子,网上搜了好久加上自己摸索,终于解决了.现在记一下也分享一下,省的下回又 ...
- [Python] Codecombat 攻略 Sarven 沙漠 (1-43关)截止至30关
首页:https://cn.codecombat.com/play语言:Python 第二界面:Sarven沙漠(43关)时间:4-11小时内容:算术运算,计数器,while循环,break(跳出循环 ...