一.点云显示模块
根据PCL中国官方论坛上田博士的四篇文章http://www.pclcn.org/bbs/forum.php?mod=viewthread&tid=223&page=1&extra=#pid750,在MFC环境中搭建了基本的点云显示模块。这是后续所有操作的基础。
1.需要解决的问题有:
( 1)由于田博士在帖子里说,PCL-1.6.0-AllInOne-msvc2010-win32中提供的VTK5.8缺少关键文件vtkMFCWindow.h和vktMFC.lib,所以无法实现基于MFC的PCL窗体。因此需要自行下载VTK5.10,用CMake生成工程文件;我下载的CMake版本是2.8.11.1,第一次进行配置的时候,看不到VTK_USE_MFC的选项,通过复选“Advanced”复选框找到了VTK_GUI_SUPPORT选项,勾选这个选项之后单击“Config”按钮,才找到了VTK_USE_MFC的选项;注意,如果不勾选VTK_USE_MFC的选项,就不能生成vtkMFC工程需要的信息;(具体过程参考笔记《VTK安装及源码编译》)。
(2)编译自己的项目时会在下面的代码处,遇到很多编译错误:
std::numeric_limits<double >::max();
std::max();
编译错误的内容是:
“(”: “::”右边的非法标记
错误原因:函数模板max与Visual C++中的全局的宏max冲突。
从网上找到的解决办法是把“std::numeric_limits<double>::max”用小括号括起来;
(std::numeric_limits<double>::max)();
(std::max)();

还有另外一种解决方法是在冲突的文件的头文件加上:#undef max
#undef min
(3)一些其他的调试问题。
2.修改点云显示模块
田博士修改的代码中点云显示类型是sensor_msgs::PointCloud2
  1. this->binary_blob.reset();
  2. binary_blob = sensor_msgs::PointCloud2::Ptr (new sensor_msgs::PointCloud2);
  3. // read new data
  4. //*.pcd文件
  5. pcl::PCDReader pcd_reader;
  6. if (pcd_reader.read ((char*)_bstr_t(filename.c_str()), *binary_blob) != 0) //* load the file
  7. {
  8. MessageBox (_T("Couldn't read PCData file!"));
  9. return;
  10. }
  11. }
  12. if (binary_blob == NULL)
  13. {
  14. MessageBox("Please load PCD file firstly!");
  15. return;
  16. }
  17. else
  18. {
  19. //其他句柄
  20. if (pcl::getFieldIndex(*binary_blob, "rgb") > 0)
  21. {
  22. color_Handler = pcl::mfc_visualization::PointCloudColorHandlerRGBField<sensor_msgs::PointCloud2>::Ptr
  23. (new pcl::mfc_visualization::PointCloudColorHandlerRGBField<sensor_msgs::PointCloud2> (binary_blob));
  24. this->viewer->addPointCloud(binary_blob, color_Handler, sensor_origin, sensor_orientation);
  25. }
  26. else
  27. {
  28. xyz_Handler = pcl::mfc_visualization::PointCloudGeometryHandlerXYZ<sensor_msgs::PointCloud2>::Ptr
  29. (new pcl::mfc_visualization::PointCloudGeometryHandlerXYZ<sensor_msgs::PointCloud2> (binary_blob));
  30. this->viewer->addPointCloud(binary_blob, xyz_Handler, sensor_origin, sensor_orientation);
  31. }
  32. this->viewer->resetCamera();
我们将其修改为pcl::PointCloud<pcl::PointXYZ>:并独立出显示函数
void CPointCloudLabDlg::simplevis (pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
//统计选取点云数
//创建3D窗口并添加点云
viewer->removeAllPointClouds();
viewer->removeAllShapes();
viewer->setBackgroundColor (0,0,0);
viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud");
viewer->setPointCloudRenderingProperties (pcl::mfc_visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
viewer->addCoordinateSystem (1.0);
//viewer->initCameraParameters ();
viewer->resetCamera();
}
图1
图2
二.点云滤波

1.直通滤波器

这是一个书桌的场景,滤波之前其可视化结果如图2所示。很明显可以看出其右侧存在一大块噪声数据,对于这种大块的且与主体点云数据存在明显界限的噪声数据,最快的方法就是直接设计一个直通滤波器,该方法简单易用,且效果明显,唯一不足的就是需要手动滤波,即用户必须经过多次尝试,找到噪声数据与主体点云数据的大致边界。图3即为直通滤波之后的结果,直通滤波器设置为保留x坐标在-0.9~0.6之间的点云数据,很明显可以看出书桌左右两部分的大量噪声数据被移除掉了。

                        图3
对于巷道
图4

2.StatisticOutlierRemoval滤波器移除离群点

   直通滤波虽然能快速移除大量的噪声点,但其具有很大的局限性,一是需要手动滤波,需要人为判断噪声点的大致位置,经过多次尝试才能找到大致的滤波范围;二是直通滤波的应用场合有限,除非噪声点与主体点云数据具有明显的界限。下面介绍一种不需要人工判断且能有限移除主体点云周围离群噪声点的方法,可以解决其中部分问题:建立点云数据的拓扑结构,对每个点的邻域进行一个统计分析,并修剪掉那些不符合一定标准的点。我们的稀疏离群点移除方法基于在输人数据中对点到临近点的距离分布的计算。对每个点,我们计算它到它的所有临近点的平均距离。假设得到的结果是一个高斯分布,其形状由均值和标准差决定,平均距离在标准范围(由全 局距离平均值 和方差定义)之外的点,可被定义为离群点并可从数据集中去除掉。使用StatisticOutlierRemoval滤波器移除离群点之前如图3所示,滤波过后如图5所示。
三.点云精简
上面两幅图的右下角都显示了其点的数量。
1.包围盒法
  该方法是首先用一个体包围盒来约束点云,将所有的点云数据置于这个包围盒中,然后把这个大包围盒分解成许多大小一致的小盒,选取与各小盒中心点或与中心点最接近的点取代各小盒中全部的点,经过该方法处理过的点云个数即为小盒的个数,该方法操作简单,能有效减少点云数量。
首先设置包围盒长宽高,一般我们就用立方体。边长越长,精简程度越大。

 2.基于Alpha Shapes

基于Alpha Shapes的点云精简算法是笔者在研究三维点云的凸包模型时发现的,三维点云的凸包模型能近似表示物体表面的轮廓,通过提取三维凸包模型的凸包点来构建物体表面,就可以大幅减少点云数据量,但是三维凸包不能真实反映物体的轮廓形貌,当物体表面存在凹陷时,凸包就不能反映出来,因此衍生出一种Alpha Shapes的概念,该方法能有效保持物体的原貌,其精简精度也易控制。下面对上面的点云进一步简化。


四.点云重建
1.贪婪投影三角化算法
设置参数

开发环境:vs2010+PCL1.6.0-32bit+MFC
源码工程下载地址:https://pan.baidu.com/s/1gfjUL4v
来自为知笔记(Wiz)

附件列表

转载于:https://www.cnblogs.com/star91/p/4761731.html

点云处理软件开发进度相关推荐

  1. 九、软件开发进度月报-模板

    九.软件开发进度月报 1.报告时间及所处的开发阶段 1 2.工程进度 1 2.1本月内的主要活动 1 2.2实际进展与计划比较 1 3.所用工时 1 4.所用机时 2 5.经费支出 2 6.工作遇到的 ...

  2. 软件开发进度管理探析

    随着计算机信息技术的飞速发展,软件项目在开发过程中的进度管理越来越受到重视.如果进度管理做得好,软件开发项目将通过延长工作时间和提高质量来满足预算要求来减少.相反,工作时间会延长,这会降低质量或超出预 ...

  3. 云原生、数据和AI、混合云、软件开发,微软再次刷新业界地位!

    两年前,微软公司CEO Satya Nadella出了一本<刷新:重新发现商业与未来>,随后微软市值一路高歌猛进冲破了万亿美元大关,成为第一大市值公司.两年后的2019年10月,微软预览了 ...

  4. 亚马逊云科技软件开发工程师团队

    在亚马逊云科技,有着这么一群人,他们经常被认为只会写代码,而不善言辞.但这只是大家对他们的误解.他们的工作不仅需要懂开发.善沟通,还需要能够dive deep用户的需求.他们就是亚马逊云科技的 Sof ...

  5. CodeArts持续发力输出,华为云重塑软件开发

    配图来自Canva可画 互联网时代,软件技术对企业成功的助益越来越明显.不管是为了顺遂大众趋势,还是迫于生存压力,可以确定的是,目前各类软件的开发已经被纳入众多企业的发展规划当中. 只是,长期以来国内 ...

  6. 管控软件开发进度 4大关键项需要重视

            1.定期跟踪和比较项目进度与计划的出入 在软件开发过程中,我们需要定期跟踪软件开发执行情况,并与开发计划进行比较,以衡量项目进度的健康程度.并对项目进行快速评估,这样有助于尽早发现问题 ...

  7. 【原创】智能云计算机(云脑)软件开发招商

    王汰非 适用科普科幻,游戏动漫,娱乐休闲,旅游观光等系统数字化.智能数字电脑可以引领人们进入宇宙各层次网上旅游观光,欣赏宇宙天体演化爆发的奇观异景,享受天上人间的微妙地步,科技进步贴近大众引领生活! ...

  8. 软件开发进度中,如何进行高风险预警管理?

            1.项目关键路径,设立预警机制 项目经理,需要在项目关键路径的把控上,一定要设立预警机制.这样有助于对项目进度进行高效把控和预警提醒,从而降低项目延期的可能性. 项目预警机制,在某节点 ...

  9. markdown写甘特图-软件开发进度实例--备忘

    gantt dateFormat YYYY-MM-DD title "所见"微信小程序-项目进度甘特图 需求分析 :active, des2, 2019-04-10, 5d 可行性 ...

最新文章

  1. 09-dispatch_source
  2. Openpose+Tensorflow 这样实现人体姿态估计 | 代码干货
  3. AI新方向: 科学家们暂停模仿“人脑”,公布了新路线图
  4. 复旦高等代数 II(17级)每周一题
  5. AS3 --调用Js
  6. 7月1日 cf总结
  7. description方法
  8. linux网络配置_linux复制和网络配置的小注意事项
  9. 汉诺塔问题 hdu 2064 hdu1997
  10. 基于JAVA+SpringBoot+Vue+Mybatis+MYSQL的图书馆管理系统
  11. 逻辑表达式是否合法_Linux shell 逻辑运算符、逻辑表达式详解
  12. 智能android电视更换播放器,GitHub - qfwc258/TvPlayer: android智能电视播放器,可以播放各电视台节目,播放基于ijkplayer的实现。...
  13. 【Excel-2010】VLOOKUP函数
  14. java基于springboot+vue的虚拟游戏道具交易商城 element
  15. 如何搭建Vue开发环境的步骤
  16. 物理计算机仿真实验报告,大学物理实验实验报告模板
  17. Windows 10 下如何显示文件的后缀名
  18. 【Qt】动画使用及惯性效果
  19. python判断是否构成三角形并计算面积
  20. 工作流系统之四十 抄送功能的实现

热门文章

  1. div透明但不导致内容div透明的解决方法
  2. 利用ACS实现AAA服务的搭建
  3. 在进行了解JAVA CLASS文件解析时必须要明白的三个概念
  4. Docker常见命令---简易教程
  5. “BASH: FORK: RESOURCE TEMPORARILY UNAVAILABLE”的解决方案
  6. 监控三个指标 并不代表你能监控Tuxedo
  7. 使用C# (.NET Core) 实现装饰模式 (Decorator Pattern) 并介绍 .NET/Core的Stream
  8. 网络采集软件核心技术剖析系列(1)---如何使用C#语言获取博客园某个博主的全部随笔链接及标题...
  9. byte[] 转Hex String
  10. PHP环境 PDOException PDOException: could not find driver