点云平面合并
//优化平面,Ransac的反复提取,冗余 template <typename Kernel> void Hypothesis<Kernel>::refine_planes() { std::vector< Planar_segment* >& segments = point_set_->planar_segments(); const typename Point_set_with_planes::Point_map& points = point_set_->point_map(); FT avg_max_dist = 0; for (std::size_t i = 0; i < segments.size(); ++i) { Planar_segment* s = segments[i]; const Plane* plane = s->fit_supporting_plane(); // user may provide invalid plane fitting (we always fit) FT max_dist = -(std::numeric_limits<FT>::max)(); for (std::size_t j = 0; j < s->size(); ++j) { std::size_t idx = s->at(j); const Point& p = points[idx]; FT sdist = CGAL::squared_distance(*plane, p); max_dist = (std::max)(max_dist, std::sqrt(sdist)); } avg_max_dist += max_dist; } avg_max_dist /= segments.size(); avg_max_dist /= FT(2.0); FT theta = static_cast<FT>(CGAL_PI * 10.0 / FT(180.0)); // in radian bool merged = false; do { merged = false; // Segments with less points have less confidences and thus should be merged first. // So we sort the segments according to their sizes. std::sort(segments.begin(), segments.end(), internal::SegmentSizeIncreasing<Planar_segment>()); for (std::size_t i = 0; i < segments.size(); ++i) { Planar_segment* s1 = segments[i]; const Plane* plane1 = s1->supporting_plane(); Vector n1 = plane1->orthogonal_vector(); internal::normalize<FT, Vector>(n1); FT num_threshold = s1->size() / FT(5.0); for (std::size_t j = i + 1; j < segments.size(); ++j) { Planar_segment* s2 = segments[j]; const Plane* plane2 = s2->supporting_plane(); Vector n2 = plane2->orthogonal_vector(); internal::normalize<FT, Vector>(n2); if (std::abs(n1 * n2) > std::cos(theta)) { std::size_t set1on2 = number_of_points_on_plane(s1, plane2, avg_max_dist); std::size_t set2on1 = number_of_points_on_plane(s2, plane1, avg_max_dist); if (set1on2 > num_threshold || set2on1 > num_threshold) { merge(s1, s2); merged = true; break; } } } if (merged) break; } } while (merged); std::sort(segments.begin(), segments.end(), internal::SegmentSizeDecreasing<Planar_segment>()); // Stores all the supporting planes for (std::size_t i = 0; i < segments.size(); ++i) { Planar_segment* s = segments[i]; const Plane* plane = s->supporting_plane(); supporting_planes_.push_back(plane); } }
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
2016-04-23 [CC]ccHObject
2016-04-23 [CC]CC插件初探
2014-04-23 [GeoServer]Openlayers简单调用