[CC]手动点云分割
CloudCompare中手动点云分割功能ccGraphicalSegmentationTool,
点击应用按钮后将现有的点云分成segmented和remaining两个点云,
//停用点云分割功能
void MainWindow::deactivateSegmentationMode(bool state)
是通过ccPointCloud的可视选择集来实现的。其中用到了点云的swap需要参考!
//创建新的点云,可视的选择集
ccGenericPointCloud* ccPointCloud::createNewCloudFromVisibilitySelection(bool removeSelectedPoints)
{
if (!isVisibilityTableInstantiated())
{
ccLog::Error(QString("[Cloud %1] Visibility table not instantiated!").arg(getName()));
return 0;
} //we create a new cloud with the "visible" points
ccPointCloud* result = 0;
{
//we create a temporary entity with the visible points only
CCLib::ReferenceCloud* rc = getTheVisiblePoints();
if (!rc)
{
//a warning message has already been issued by getTheVisiblePoints!
//ccLog::Warning("[ccPointCloud::createNewCloudFromVisibilitySelection] An error occurred during points selection!");
return 0;
}
assert(rc->size() != 0); //convert selection to cloud
result = partialClone(rc); //don't need this one anymore
delete rc;
rc = 0;
} if (!result)
{
ccLog::Warning("[ccPointCloud::createNewCloudFromVisibilitySelection] An error occurred during segmentation!");
return 0;
} result->setName(getName()+QString(".segmented"));//切割出来的点云 //shall the visible points be erased from this cloud?
if (removeSelectedPoints && !isLocked())
{
//we drop the octree before modifying this cloud's contents
deleteOctree();
clearLOD(); unsigned count = size(); //we have to take care of scan grids first
{
//we need a map between old and new indexes
std::vector<int> newIndexMap(size(), -1);
{
unsigned newIndex = 0;
for (unsigned i=0; i<count; ++i)
{
if (m_pointsVisibility->getValue(i) != POINT_VISIBLE)
newIndexMap[i] = newIndex++;
}
} //then update the indexes
UpdateGridIndexes(newIndexMap, m_grids); //and reset the invalid (empty) ones
//(DGM: we don't erase them as they may still be useful?)
for (size_t i=0; i<m_grids.size(); ++i)
{
Grid::Shared& scanGrid = m_grids[i];
if (scanGrid->validCount == 0)
{
scanGrid->indexes.clear();
}
}
} //we remove all visible points
unsigned lastPoint = 0;
for (unsigned i=0; i<count; ++i)
{
//i持续增长,而lastPoint遇到==POINT_VISIBLE则跳过,起到迁移的效果
if (m_pointsVisibility->getValue(i) != POINT_VISIBLE)
{
if (i != lastPoint)
swapPoints(lastPoint,i);
++lastPoint;
}
} //TODO: handle associated meshes resize(lastPoint); refreshBB(); //calls notifyGeometryUpdate + releaseVBOs
} return result;
}
调用的方法getTheVisiblePoints()
CCLib::ReferenceCloud* ccGenericPointCloud::getTheVisiblePoints() const
{
unsigned count = size();
assert(count == m_pointsVisibility->currentSize()); if (!m_pointsVisibility || m_pointsVisibility->currentSize() != count)
{
ccLog::Warning("[ccGenericPointCloud::getTheVisiblePoints] No visibility table instantiated!");
return 0;
} //count the number of points to copy
unsigned pointCount = 0;
{
for (unsigned i=0; i<count; ++i)
if (m_pointsVisibility->getValue(i) == POINT_VISIBLE)
++pointCount;
} if (pointCount == 0)
{
ccLog::Warning("[ccGenericPointCloud::getTheVisiblePoints] No point in selection");
return 0;
} //we create an entity with the 'visible' vertices only
CCLib::ReferenceCloud* rc = new CCLib::ReferenceCloud(const_cast<ccGenericPointCloud*>(this));
if (rc->reserve(pointCount))
{
for (unsigned i=0; i<count; ++i)
if (m_pointsVisibility->getValue(i) == POINT_VISIBLE)
rc->addPointIndex(i); //can't fail (see above)
}
else
{
delete rc;
rc = 0;
ccLog::Error("[ccGenericPointCloud::getTheVisiblePoints] Not enough memory!");
} return rc;
}
[CC]手动点云分割的更多相关文章
- 基于传统方法点云分割以及PCL中分割模块
之前在微信公众号中更新了以下几个章节 1,如何学习PCL以及一些基础的知识 2,PCL中IO口以及common模块的介绍 3,PCL中常用的两种数据结构KDtree以及Octree树的介绍 ...
- PCL—低层次视觉—点云分割(基于凹凸性)
1.图像分割的两条思路 场景分割时机器视觉中的重要任务,尤其对家庭机器人而言,优秀的场景分割算法是实现复杂功能的基础.但是大家搞了几十年也还没搞定——不是我说的,是接下来要介绍的这篇论文说的.图像分割 ...
- PCL点云分割(1)
点云分割是根据空间,几何和纹理等特征对点云进行划分,使得同一划分内的点云拥有相似的特征,点云的有效分割往往是许多应用的前提,例如逆向工作,CAD领域对零件的不同扫描表面进行分割,然后才能更好的进行空洞 ...
- PCL—点云分割(基于凹凸性) 低层次点云处理
博客转载自:http://www.cnblogs.com/ironstark/p/5027269.html 1.图像分割的两条思路 场景分割时机器视觉中的重要任务,尤其对家庭机器人而言,优秀的场景分割 ...
- PCL—低层次视觉—点云分割(基于形态学)
1.航空测量与点云的形态学 航空测量是对地形地貌进行测量的一种高效手段.生成地形三维形貌一直是地球学,测量学的研究重点.但对于城市,森林,等独特地形来说,航空测量会受到影响.因为土地表面的树,地面上的 ...
- PCL—低层次视觉—点云分割(超体聚类)
1.超体聚类——一种来自图像的分割方法 超体(supervoxel)是一种集合,集合的元素是“体”.与体素滤波器中的体类似,其本质是一个个的小方块.与之前提到的所有分割手段不同,超体聚类的目的并不是分 ...
- PCL—低层次视觉—点云分割(最小割算法)
1.点云分割的精度 在之前的两个章节里介绍了基于采样一致的点云分割和基于临近搜索的点云分割算法.基于采样一致的点云分割算法显然是意识流的,它只能割出大概的点云(可能是杯子的一部分,但杯把儿肯定没分割出 ...
- PCL—低层次视觉—点云分割(RanSaC)
点云分割 点云分割可谓点云处理的精髓,也是三维图像相对二维图像最大优势的体现.不过多插一句,自Niloy J Mitra教授的Global contrast based salient region ...
- segMatch:基于3D点云分割的回环检测
该论文的地址是:https://arxiv.org/pdf/1609.07720.pdf segmatch是一个提供车辆的回环检测的技术,使用提取和匹配分割的三维激光点云技术.分割的例子可以在下面的图 ...
随机推荐
- 算法系列:Fibonacci
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
- ASP.NET MVC与ASP.NET Web Form简单区别与适用场景
概论: Asp.net 微软 提供web开发框架或者技术.分Web Form和ASP.NET MVC.下面简单说明各自优缺点及使用场景. Web Form 优点: 1.支持丰富的服务器控件.如:Gr ...
- 一键删除.svn文件bat脚本
用过SVN或CVS版本控制工具的朋友,在享受着它们给我们带来的方便的同时,也许也在为这么一件事情苦恼: 如果某个目录在SVN或CVS版本控制工具的控制之下时.该目录下以及该子孙目录下都会有一个.svn ...
- nfs的挂载方法
对于很多嵌入式驱动开发者,要进行很多次调试,如果nfs搭建不起来,那么对开发是很不方便的.经过三天,我终于把自己编的内核下载到开发板,并实现了nfs文件系统的挂载.今天把过程写下来. 思路 一 编译a ...
- PV 与 并发数 之间的故事
PV: Page View UV: Unique Visitor 在一些已经上线的项目中,运营会统计每日的PV,UV,IP 等数据 而根据PV量,可以推算出一个相对较科学的并发数,来作为负载测试的一个 ...
- 全站 HTTPS 来了
!版权声明:本文为腾讯Bugly原创文章,转载请注明出处腾讯Bugly特约作者:刘强 最近大家在使用百度.谷歌或淘宝的时候,是不是注意浏览器左上角已经全部出现了一把绿色锁,这把锁表明该网站已经使用了 ...
- Shell 编程基础之 && 与 ||
一.引言 Shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 $? 中.当 $? == 0 时,表示执行成功:当 $? == 1 时,表示执行失败.有时候,下一条命令 ...
- 【原】PHP初体验
1. 相关内容介绍 1>互联网开发 互联网:传统互联网.移动互联网 互联网开发:前端开发(前台).后台开发(后端.服务端) 前端开发:视觉展示(用户界面).用户交互.采集输入信息 后台开发:管理 ...
- Leetcode Gray Code
题目的意思就是将十进制转换成格雷码 首先将二进制转换成格雷码 根据此图可以看出二进制的第i和第i+1位异或为格雷码的第i+1位,对于给定的十进制数x,其(x>>1)相当于二进制向右移动一位 ...
- 解决使用osgModeling的Loft生成管子时的bug
最近在使用osgModeling的Loft生成管子的时候, 发现这个类还是有点bug的. 具体的表现就是在某些情况下, 生成管子的某些节点会是扁的, 而且有时管子会莫名的变粗. 在网上各种求助无果 ...