CGAL 根据扫描线方向和角度对法向量进行重定向

2023-10-31

一、算法原理

在这里插入图片描述

  最小生成树对法向量定向的结果在具有许多尖锐特征和遮挡的机载点云数据中结果并不理想。scanline_orient_normals()是专门用于具有扫描线特性的点云法向量重定向的替代方法。它充分利用了某些激光雷达扫描器的LAS特性,是处理2.5D城市场景中车载或机载点云法向量方向重定向的最佳选择。

1、主要函数

头文件

#include <CGAL/scanline_orient_normals.h>

scanline_orient_normals()

void CGAL::scanline_orient_normals  ( PointRange &  points,  
  const NamedParameters &  np = parameters::default_values()  
 ) 

  通过检查扫描视线方向与当前法线方向的一致性,对点云的法向量进行定向。这个函数要求输入的点是沿着xy平面上对齐的扫描线排序。这种数据通常是通过机载或车载激光雷达设备获得。当提供scanline_id_mapscan_angle时,该方法会给出最优结果。只要点集在2.5D扫描线中有序排列,在缺少其中一个或两个属性的情况下,仍然可以生成正确的结果。

  1. 首先,通过对点进行迭代,获取位于同一扫描线上的点:
  • 如果提供了命名参数scanline_id_map,则每次id更改时范围都会被切断。
  • 如果没有提供扫描线ID映射,回退方法只是简单地在投影xy平面上每次有3个连续点形成锐角时削减范围。这种回退方法给出了次优结果。
  1. 然后,估计每个点与扫描器位置之间的视线(采集时的估计矢量):
  • 如果提供了scan_angle,视线可以直接计算为估计扫描线和扫描角度的组合。
  • 如果没有提供扫scan_angle,扫描仪的位置估计为在xy平面上投影扫描线各点的重心之上。这种回退方法给出了次优结果。
      一旦对每个点的视线进行了估计,就可以通过视点来调整法向量的方向,如果视线和法线向量乘积为正则法向量方向为正的,否则法向量是反的。

二、代码实现

#include <CGAL/Simple_cartesian.h>
#include <CGAL/IO/read_las_points.h>
#include <CGAL/IO/write_ply_points.h>
#include <CGAL/jet_estimate_normals.h>
#include <CGAL/scanline_orient_normals.h>

using Kernel = CGAL::Simple_cartesian<double>;

using Point_with_info = std::tuple<Kernel::Point_3, Kernel::Vector_3, float, unsigned char>;
using Point_map = CGAL::Nth_of_tuple_property_map<0, Point_with_info>;
using Normal_map = CGAL::Nth_of_tuple_property_map<1, Point_with_info>;
using Scan_angle_map = CGAL::Nth_of_tuple_property_map<2, Point_with_info>;
using Scanline_id_map = CGAL::Nth_of_tuple_property_map<3, Point_with_info>;

void dump(const char* filename, const std::vector<Point_with_info>& points)
{
	std::ofstream ofile(filename, std::ios::binary);
	CGAL::IO::set_binary_mode(ofile);
	CGAL::IO::write_PLY(ofile, points, CGAL::parameters::point_map(Point_map()).
		normal_map(Normal_map()));

}

int main(int argc, char** argv)
{
	std::string fname( "cgal//urban.las");

	std::vector<Point_with_info> points;
	// ----------------------------------读取las点云--------------------------------------
	std::cerr << "Reading input file " << fname << std::endl;
	std::ifstream ifile(fname, std::ios::binary);
	if (!ifile ||
		!CGAL::IO::read_LAS_with_properties(ifile, std::back_inserter(points),
			CGAL::IO::make_las_point_reader(Point_map()),
			std::make_pair(Scan_angle_map(),CGAL::IO::LAS_property::Scan_angle()),
			std::make_pair(Scanline_id_map(),CGAL::IO::LAS_property::Scan_direction_flag())))
	{
		std::cerr << "Can't read " << fname << std::endl;
		return -1;
	}
	// --------------------------------计算法向量----------------------------------------
	std::cerr << "Estimating normals" << std::endl;
	CGAL::jet_estimate_normals<CGAL::Parallel_if_available_tag>(points, 12,
			CGAL::parameters::point_map(Point_map()).normal_map(Normal_map()));
	// ---------------------使用扫描角度和扫描方向重定向法线-----------------------------
	std::cerr << "Orienting normals using scan angle and direction flag" << std::endl;
	CGAL::scanline_orient_normals(points,CGAL::parameters::point_map(Point_map()).
		normal_map(Normal_map()).scan_angle_map(Scan_angle_map()).scanline_id_map(Scanline_id_map()));

	dump("out_angle_and_flag.ply", points);
	// ---------------------使用扫描方向对点云进行法线定向-------------------------------
	std::cerr << "Orienting normals using scan direction flag only" << std::endl;
	CGAL::scanline_orient_normals(points,CGAL::parameters::point_map(Point_map()).
		normal_map(Normal_map()).
		scanline_id_map(Scanline_id_map()));
	dump("out_flag.ply", points);
	// ---------------------使用扫描角度对点云进行法线定向-------------------------------
	std::cerr << "Orienting normals using scan angle only" << std::endl;
	CGAL::scanline_orient_normals(points,CGAL::parameters::point_map(Point_map()).
		normal_map(Normal_map()).
		scan_angle_map(Scan_angle_map()));

	dump("out_angle.ply", points);
	// -----------------------不使用额外信息的法线定向-----------------------------------
	std::cerr << "Orienting normals using no additional info" << std::endl;
	CGAL::scanline_orient_normals(points,CGAL::parameters::point_map(Point_map()).
		normal_map(Normal_map()));
	dump("out_nothing.ply", points);

	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CGAL 根据扫描线方向和角度对法向量进行重定向 的相关文章

  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • Java 如何对中文排序

    字符串的 compareTo 方法是不能对中文排序的 下面这个例子中的中文使用 compareTo 方法排序后得到的是乱序 List
  • 23功能之海量文件(内存不足100M)的排序

    23功能之海量文件 内存不足100M 的排序 参考自 如何处理大数据量的磁盘文件 程序用编程艺术 1 思想 这里使用了多路归并 因为二路归并时 由于最后的两个文件变得越来越大 导致内存还是不满足 但多路归并时会因文件IO而变得慢 步骤 1
  • 【Linux开发】编写属于你的第一个Linux内核模块

    曾经多少次想要在内核游荡 曾经多少次茫然不知方向 你不要再对着它迷惘 让我们指引你走向前方 内核编程常常看起来像是黑魔法 而在亚瑟 C 克拉克的眼中 它八成就是了 Linux内核和它的用户空间是大不相同的 抛开漫不经心 你必须小心翼翼 因为
  • mac vim高亮及缩进设置

    转载自 http www 32133 com labrary 564 html 将vim的环境文件copy到自己常用用户的主目录下 cp usr share vim vimrc vimrc 修改 vimrc文件归读写属性 sudo chmo
  • 知乎:到底去大公司还是小公司?

    文章来源 dwz cn NA3E0JFG 职场生涯总会面临着选择 尤其对我们这些 IT 人来说 跳槽的频率应该是所有行业中相当大的了 那么我们跳来跳去 究竟该选择什么样的公司 大 or 小 工作三年多了 经历一大一小 最近也面试了不少家公司
  • 线程同步(一)

    上篇文章讲述了什么是线程 以及在Linux系统下线程的相关操作 线程 Linux系统实现 小梁今天敲代码了吗的博客 CSDN博客 本文将继续讲述线程的相关知识 线程同步 目录 1 线程同步的概念 2 线程不同步可能会发生什么 3 线程同步方
  • yolov8Pose实战

    目录 前言 一 yolov8环境搭建 二 测试 训练模型 评估模型 并导出模型 实测检测效果 测试人体姿态估计 前言 YOLO系列层出不穷 从yolov5到现在的yolov8仅仅不到一年的时间 追踪新技术 了解前沿算法 一起来测试下yolo
  • 全国大学生数学建模比赛介绍及其入门(国赛+美赛)

    1 数学建模介绍 1 1 数学建模概念 数学建模是将实际问题转化为数学问题 通过建立数学模型 编写程序求解的过程 如某区域水资源评价问题 水利工程项目风险评价问题 水资源污染增长预测问题 快递员派送快递的最短路径问题等等 1 2 数学模型的
  • Linux下压缩解压命令

    Linux下压缩解压命令 1 命令 zip 压缩 文件 zip 压缩文件名 需要压缩的文件 eg zip passwd zip passwd 目录 zip r 压缩文件名 需要压缩的目录 eg zip r test zip test 特点
  • 运行.exe,并自动关闭.exe

    运行exe文件 进行计算 并一次计算完毕后自动关闭exe界面 结束线程 可用于循环启动 exe param rnRuntime public static void test3 Runtime rnRuntime try 如果想自动关闭 r
  • How Do Vision Transformers Work? ICLR2022

    文章标题 How Do Vision Transformers Work 是 ICLR2022 spotlight 从大佬那里入的这篇文章的坑 遂做了个报告 大佬的视频来源 https www bilibili com video BV1G
  • 【论文复现】——Patchwork++:基于点云的快速稳健地面分割方法

    目录 一 算法原理 1 Git源码 2 论文概述 3 参考文献 二 代码实现 三 结果展示 四 相关链接 一 算法原理 本文使用PCL进行实现 1 Git源码 这是韩国团队2022年的最新文章 Patchwork Fast and Robu
  • Unity3d场景中出现闪面的解决方法

    当你发现在unity3d场景中 发现有闪面的现象 基本上是由于面之间的距离太近导致的 专业术语Z Fighting 出现这种情况可以调整摄像机的Clipping plane属性中的Near值来解决这个问题
  • 技能树-网络爬虫-BeautifulSoup

    文章目录 前言 一 获取所有p标签 二 获取所有text 三 获取所有图片地址 总结 前言 技能树 网络爬虫 BeautifulSoup Python入门技能树 大家好 我是空空star 本篇给大家分享一下 技能树 网络爬虫 Beautif
  • 数学实验-迭代(二)-分形(Mathematica实现)

    一 实验环境 Mathematica 10 3软件 二 实验目的 以迭代的观点介绍分形的基本特性以及生成分形图形的基本方法 使我们在欣赏美丽的分形图形的同时对分形几何这门学科有一个直观的了解 三 实验内容和步骤以及结果分析 实验2 1 Ko
  • 【DA 01】Domain-Adversarial Training of Neural Networks

    Abstract 本文提出一种适用于domain adaptation的representation learning方法 训练和测试数据来自相似但不同的分布 本文方法受启发于领域自适应的理论 为实现域迁移 预测必须要基于不可分辨的训练 s
  • Unix网络编程第三版源码编译

    环境 cat etc issue Ubuntu 12 04 1 LTS n l cat proc version Linux version 3 2 0 48 generic buildd komainu gcc version 4 6 3
  • 【containerd错误解决系列】uos arm主机 docker及containerd都拉不下来镜像

    操作 yum remove unpigz docker pull xxx crictl pull xxx 删除了这个包就可以了 具体说明参考下面的文档 参考 解决国产系统 Docker 拉取大镜像卡顿之谜
  • 虚函数、纯虚函数、多态

    一 虚函数 在基类的函数前加上virtual关键字 在派生类中重写该函数 运行时将会根据所指对象的实际类型来调用相应的函数 如果对象类型是派生类 就调用派生类的函数 如果对象类型是基类 就调用基类的函数 一 虚表和虚基表指针 虚函数表 Vi
  • CGAL 根据扫描线方向和角度对法向量进行重定向

    目录 一 算法原理 1 主要函数 二 代码实现 一 算法原理 最小生成树对法向量定向的结果在具有许多尖锐特征和遮挡的机载点云数据中结果并不理想 scanline orient normals 是专门用于具有扫描线特性的点云法向量重定向的替代