激光相机数据融合(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#中常量、ReadOnly和Static ReadOnly的差异
不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: http://www.arungudelli.com/tutorial ...
- 让asp.net网站支持多语言,使用资源文件
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test.aspx.cs&quo ...
- thrift例子:python客户端/java服务端
java服务端的代码请看上文. 1.说明: 这两篇文章其实解决的问题是,当使用python去访问大数据线上集群的时候,遇到两个问题: 1)python-hadoop和python-hive相关包链接不 ...
- 关于scanf 与 cin gets(),getline()......输入输出字符串的区别
很对人对于字符串的输入输出一直是比较模糊的,今天总结一下几个常用的输入流符号对于输入字符串时的区别: 1.scanf(),首先 它遇到空格或回车键(\n)就会结束,并且会将回车符算入字符串中: 2.c ...
- 【转】FIO使用指南
原文地址:http://blog.csdn.net/yuesichiu/article/details/8722417 Fio压测工具和io队列深度理解和误区 这个文档是对fio-2.0.9 HOWT ...
- LINUX 笔记-cal 命令
显示当前月份日历 命令:cal 显示指定月份的日历 命令:cal 9 2012 显示2016年日历 命令:cal 2016
- Ajax.Nodejs.跨域访问
使用环境: 客户端: jQuery 服务器: Node.js 在通过Ajax调用非本域的链接/接口时, 一般是不能成功的, 就算是同一个IP下不同的端口也被认作跨域访问 解决办法记录如下: 客户端: ...
- Java基础总结--Java编程环境变量配置
1.jdk--bin--都是命令行程序(图形化是对命令行的封装)eg javac&java执行javac必须切换到其所在目录--太麻烦---想在任意目录下使用要执行一个命令--先在当前目录下找 ...
- 运用El表达式截取字符串/获取list的长度
${fn:substring(wjcd.lrsj, 0, 16)} 使用functions函数来获取list的长度 ${fn:length(list)} 引入 <%@ taglib prefix ...
- PHP垃圾回收机制
一.引用计数基本知识 每个php变量存在一个叫"zval"的变量容器中,当一个变量被赋常量值时,就会生成一个zval变量容器.一个zval变量容器,除了包含变量的类型和值,还包括两 ...