激光相机数据融合(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融合效果对比 简述 ...
随机推荐
- C语言 流缓冲
**From : https://www.gnu.org/software/libc/manual/html_node/Stream-Buffering.html** 12.20 流缓冲 通常情况下, ...
- 解决MySQL中文乱码问题
决解乱码费了我好些时间啊! 乱码原因有 1.mysql未设置为支持汉字 2.没有发送头信息 3.使用的编译器不符合相应的编码 决解的方法是 在mysql里 我用的是Wanmp Server 1.在my ...
- Vue.js2.0中的变化(持续更新中)
最近自己在学习Vue.js,在看一些课程的时候可能Vue更新太块了导致课程所讲知识和现在Vue的版本不符,从而报错,我会在以后的帖子持续更新Vue的变化与更新,大家也可以一起交流,共同监督学习! 1. ...
- Node Sass could not find a binding for your current environment 解决办法
具体错误如下: 解决办法: 命令行执行 npm rebuild node-sass 命令(如果不行,则先运行npm install node-sass命令执行再执行 npm rebuild nod ...
- web 开发中的路由是什么意思
路由: 就是一个路径的解析,根据客户端提交的路径,将请求解析到相应的控制器上 从 URL 找到处理这个 URL 的类和函数
- .13-Vue源码之patch(3)(终于完事)
怎么感觉遥遥无期了呀~这个源码,跑不完了. 这个系列写的不好,仅作为一个记录,善始善终,反正也没人看,写着玩吧! 接着上一节的cbs,这个对象在初始化应该只会调用create模块数组方法,简单回顾一下 ...
- 爱上朴实的CSS细节
英文原文:Learning to Love the Boring Bits of CSS 未来的CSS太让人兴奋了:一方面,是全新的页面布局方式:另一方面,是酷炫的滤镜.颜色等视觉效果.这些CSS, ...
- 京东口红top 30分析
一.抓取商品id 分析网页源码,发现所有id都是在class="gl-item"的标签里,可以利用bs4的select方法查找标签,获取id: 获取id后,分析商品页面可知道每个商 ...
- shell 组合新的变量名
shell 组合新的变量名 普通变量 name=yushuang var=name # 要获取到yushuang res=`eval echo '$'"$var"` echo $r ...
- GCC(警告.优化以及调试选项)
GCC(警告.优化以及调试选项) [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件 预处 ...