这一节将用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仿真数据融合的更多相关文章

  1. 七牛云 融合CDN测试域名 -> 融合CDN加速域名

    七牛云 融合CDN测试域名 -> 融合CDN加速域名 本篇主要讲解 如何将七牛云融合CDN测试域名 切换到自定义的加速域名上去,为什么会写这篇是因为我收到了一封 [七牛云]测试域名回收通知的邮件 ...

  2. 激光相机数据融合(4)--KITTI数据集中matlab接口说明及扩展

    KITTI数据集接口已经提供了matlab接口,本篇将说明详细说明其应用并与PCL进行对接.PCL为C++点云处理语言库,详情可见:http://pointclouds.org/ 程序可以从官网下载, ...

  3. 激光相机数据融合(3)--KITTI数据集

    KITTI数据集提供了双目图像,激光数据,和imu/gps位置信息,其中还包括了大量的算法.下载地址为:http://www.cvlibs.net/datasets/kitti/raw_data.ph ...

  4. 数据融合(data fusion)原理与方法

    数据融合(data fusion)原理与方法 数据融合(data fusion)最早被应用于军事领域.     现在数据融合的主要应用领域有:多源影像复合.机器人和智能仪器系统.战场和无人驾驶飞机.图 ...

  5. IDM主机上安装融合应用程序配置框架

    IDM主机上安装融合应用程序配置框架   安装Oracle融合应用程序>设置>身份和访问管理节点安装融合应用程序配置框架 由于我们使用Oracle VirtualBox虚拟机这一次,我们在 ...

  6. DirectX基础学习系列5 融合技术

    7.1融合方程 1概念 融合技术将当前光栅化像素的颜色与以前已光栅化并处于同一个位置的像素颜色进行合成,即将当前要进行光栅化的三角形单元与已写入后台的像素进行融合 2需要遵循的原则: (1)先绘制不需 ...

  7. Gluon炼丹(Kaggle 120种狗分类,迁移学习加双模型融合)

    这是在kaggle上的一个练习比赛,使用的是ImageNet数据集的子集. 注意,mxnet版本要高于0.12.1b2017112. 下载数据集. train.zip test.zip labels ...

  8. SSE图像算法优化系列二十九:基础的拉普拉斯金字塔融合用于改善图像增强中易出现的过增强问题(一)

    拉普拉斯金字塔融合是多图融合相关算法里最简单和最容易实现的一种,我们在看网络上大部分的文章都是在拿那个苹果和橙子融合在一起,变成一个果橙的效果作为例子说明.在这方面确实融合的比较好.但是本文我们主要讲 ...

  9. GDAL多光谱与全色图像融合简单使用

    目录 简述 C++代码 效果对比 GDAL融合效果和原始多光谱波段对比 GDAL融合效果和原始全色波段对比 ARCGIS融合效果与原始全色和多光谱对比 GDAL融合效果与ArcGIS融合效果对比 简述 ...

随机推荐

  1. Vue实现选项卡切换

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. 使用dropload.js插件进行下拉刷新

    移动端的下拉刷新是一个比较常见的功能了,网上也有很多框架,插件都有这种功能,所以直接拿来用就好了. html代码: <!--选项卡--><div class="tab&qu ...

  3. 使用hive客户端java api读写hive集群上的信息

    上文介绍了hdfs集群信息的读取方式,本文说hive 1.先解决依赖 <properties> <hive.version>1.2.1</hive.version> ...

  4. checkValidity-表达验证方法。

    调用该方法,可以显示对表单元素进行有效验证,返回值是boolean. 代码如下: <!DOCTYPE html> <html> <head> <meta ch ...

  5. 彻底理解Java的Future模式

    先上一个场景:假如你突然想做饭,但是没有厨具,也没有食材.网上购买厨具比较方便,食材去超市买更放心. 实现分析:在快递员送厨具的期间,我们肯定不会闲着,可以去超市买食材.所以,在主线程里面另起一个子线 ...

  6. Android基础知识06—活动的四大启动模式

    ------ 活动的启动模式 ------ 在实际项目中应该根据特定的需求为每个活动指定恰当的启动模式. 四种启动模式: standard . singleTop . singleTask . sin ...

  7. 转:C++输入一行字符串的一点小结

    原文链接: http://www.wutianqi.com/?p=1181 大家在学习C++编程时,一般在输入方面都是使用的cin.而cin是使用空白(空格,制表符和换行符)来定字符串的界的.这就导致 ...

  8. KDevelop使用笔记【中文】

    师从官方文档: https://userbase.kde.org/KDevelop4/Manual https://docs.kde.org/trunk5/en/extragear-kdevelop/ ...

  9. [译]ASP.NET Core 2.0 带初始参数的中间件

    问题 如何在ASP.NET Core 2.0向中间件传入初始参数? 答案 在一个空项目中,创建一个POCO(Plain Old CLR Object)来保存中间件所需的参数: public class ...

  10. 基于HTML5的WebGL实现的2D3D迷宫小游戏

    为了实现一个基于HTML5的场景小游戏,我采用了HT for Web来实现,短短200行代码,我就能实现用"第一人称"来操作前进后退上下左右,并且实现了碰撞检测. 先来看下实现的效 ...