OpenMVS源码阅读笔记(2)------DensifyPointCloud.cpp

 DensifyPointCloud.cpp

179-194(try  catch)

这段代码是用于解析命令行参数和配置文件的一般流程,通常在程序启动时执行。以下是关于这段代码的解释:

1. `try` 块:
   - 这是一个异常处理块,用于捕获潜在的异常。

2. 解析命令行参数:
   - `boost::program_options` 库用于解析命令行参数。
   - `boost::program_options::command_line_parser` 用于解析传递给程序的命令行参数。`argc` 和 `argv` 是 `main` 函数传递的参数数量和参数数组。
   - `cmdline_options` 包含在命令行中可接受的选项的定义。
   - `boost::program_options::store` 用于将解析的命令行参数存储在 `OPT::vm`(一个选项变量存储器)中。
   - `boost::program_options::notify` 通知选项变量存储器已经准备好。

3. 初始化工作文件夹:
   - `INIT_WORKING_FOLDER` 可能是一个宏或函数,用于设置工作目录或路径。

4. 解析配置文件:
   - 程序尝试打开并解析配置文件(通常是一个文本文件),以覆盖命令行参数。
   - `OPT::strConfigFileName` 包含配置文件的路径。
   - 如果配置文件存在,`parse_config_file` 函数用于解析文件中的选项,并将其存储在 `OPT::vm` 中。
   - 最后,`boost::program_options::notify` 通知选项变量存储器已经准备好。

5. 异常处理:
   - 如果在解析命令行参数或配置文件时发生异常,`catch` 块将捕获异常。
   - 异常信息(通常是错误消息)通过 `e.what()` 获得。
   - 异常消息被记录到日志中,然后函数返回 `false` 表示出现了错误。

总之,这段代码用于解析和处理命令行参数和配置文件。如果解析过程中发生异常,它将记录异常信息并返回 `false` 表示解析失败。否则,程序将继续执行。

227( OPTDENSE::oConfig.Load(OPT::strDenseConfigFileName) )

这行代码中包含了以下操作:

1. `OPTDENSE::oConfig` 是一个对象,可能是一个配置对象或者用于存储配置信息的数据结构。

2. `Load` 是一个成员函数或方法,用于从文件 `OPT::strDenseConfigFileName` 中加载配置信息。这行代码执行了加载操作。

3. `const bool bValidConfig` 声明并初始化了一个布尔变量 `bValidConfig`,用于存储加载配置信息的结果。`const` 修饰这个变量,表示这是一个常量,不可被修改。

4. `bValidConfig` 的值是根据加载配置信息的成功与否而确定的,通常,如果加载成功,它的值为 `true`,否则为 `false`。

这行代码的目的是加载配置信息,并通过 `bValidConfig` 变量来指示是否加载成功。如果加载失败,`bValidConfig` 的值将为 `false`,否则为 `true`。加载配置信息通常是为了获取程序的设置、参数或其他配置,以便程序在后续执行中使用这些配置。

Scene.h

主要定义了scene类。

public:
	PlatformArr platforms; // 相机平台,每个平台都包含已安装的摄像机和所有已知姿势
	ImageArr images; // 图像,每个图像都引用平台的相机姿势
	PointCloud pointcloud; // 点云(稀疏或密集),每个点云都包含点
	Mesh mesh; // 网格,表示为顶点和三角形,由输入点云构建
	OBB3f obb; // 可选的感兴趣区域;包含整个场景的定向边界框

	unsigned nCalibratedImages; // 有效图像数量

	unsigned nMaxThreads; // 用于分配工作负载的最大线程数

Scene.cpp

480-521( Scene::Import )

523-583( Scene::Load )

主要就是进行文件的读取,将读取的数据进行赋值。

这段代码执行以下操作:

 `TD_TIMER_STARTD();`: 这是一个调试目的的计时器启动操作。通常,`TD_TIMER_STARTD()` 可能是一个宏或函数,用于记录当前时间以便进行性能分析或计时操作。

`Release();`: `Release` 函数或方法用于释放、清理或关闭应用程序或资源的操作。在此之前,可能需要停止或释放任何正在运行的进程、关闭文件、释放内存、关闭数据库连接等。

这段代码的目的是在开始计时之前执行释放操作。通常,这用于在计算某些操作的执行时间时,排除掉释放资源所花费的时间。这有助于更精确地测量某段代码的执行时间。

std::ifstream fs(fileName, std::ios::in | std::ios::binary);

这行代码创建了一个名为 `fs` 的输入文件流对象,它用于从指定的文件 `fileName` 读取数据。这里使用了以下两个标志:

1. `std::ios::in`: 这个标志表示文件流将被用于读取操作,也就是说,你可以从文件中读取数据。

2. `std::ios::binary`: 这个标志表示以二进制模式打开文件。在二进制模式下,文件将以字节为单位进行读取和写入,而不会将行末尾字符(例如 `\n`)解释为特殊字符。这对于处理非文本文件(如图像、音频或二进制数据文件)非常有用。

这行代码创建了一个文件流对象 `fs`,它准备好用于读取二进制文件 `fileName`。你可以使用 `fs` 对象来执行文件读取操作,例如读取二进制数据并将其存储在适当的数据结构中。

fs.read(szHeader, 4);

`fs.read(szHeader, 4)` 是使用 `std::ifstream` 对象 `fs` 读取文件的操作。这行代码的含义是:

- `fs.read`:这是 `std::ifstream` 类的一个成员函数,用于从文件中读取数据。
- `szHeader`:这是一个字符数组或字符串,用于存储从文件中读取的数据。在这种情况下,它被用来存储文件的前4个字节。
- `4`:这表示要读取的字节数。在这里,它指定要从文件中读取的字节数,即 4 字节。

因此,这行代码的作用是从文件中读取 4 个字节的数据,并将其存储在 `szHeader` 中。通常,这是用来读取文件头或文件的一部分信息。

boost::archive::text_iarchive ar(fs, flags);

这行代码创建了一个 `text_iarchive` 对象 `ar`,用于从文件流 `fs` 中读取文本格式的序列化数据。这是 Boost 库的序列化功能的一部分,用于反序列化对象。

在这行代码中,`fs` 是一个 `std::ifstream`,代表要读取的文件流。`flags` 是用于控制序列化操作的标志,然后通过这个文件流 `fs` 创建了 `text_iarchive` 对象 `ar`。

一旦创建了 `ar` 对象,你可以使用它来还原先前序列化的对象。通常,你将会使用 `ar` 对象的 `>>` 运算符来反序列化数据,并将其还原为程序中的对象。例如:

```cpp
SomeClass obj;
ar >> obj; // 从 ar 中读取数据并还原到 obj 对象中
```

这行代码的执行将导致 `ar` 从文件流 `fs` 中读取数据,然后将其还原为 `obj` 对象的内容。

Boost 库的序列化功能提供了一种方便的方法,可以将对象保存到文件中,然后再从文件中加载它们,这在数据持久性、数据交换等方面非常有用。

DepthMap.h

83( DECOPT_SPACE(OPTDENSE) )

`DECOPT_SPACE` 是一个宏,通常用于在程序中定义或声明一组选项或参数。在这里,`DECOPT_SPACE(OPTDENSE)` 可能表示要在 `OPTDENSE` 命名空间中定义一组参数或选项。

这个宏通常用于帮助组织程序的不同配置选项,使得它们可以按照不同的模块或功能组织在不同的命名空间中,以提高代码的可维护性和结构化。在命名空间中定义参数或选项可以更清晰地区分它们,避免与其他部分的代码发生冲突。

宏的具体定义和用法会根据代码库的实现和规范而有所不同,因此您需要查看程序的代码库或文档以获取更多关于这个宏的信息。通常,`DECOPT_SPACE(OPTDENSE)` 可能是一个宏调用,用于在 `OPTDENSE` 命名空间中定义一些用于稠密重建的配置选项。

这段代码是一个宏定义,定义了一个名为 `DECOPT_SPACE` 的宏。宏的目的是创建一个命名空间,并在其中声明一些函数、变量和对象。

在这个宏中:

- `DECOPT_SPACE(SPACE)` 是宏的名称,其中 `SPACE` 是一个占位符,表示命名空间的名称。
- `namespace SPACE { ... }` 是命名空间的定义,其中包括一些函数、变量和对象的声明。
- `void init();` 和 `void update();` 是在命名空间中声明的两个函数。
- `extern SEACAVE::VoidArr arrFncOpt;` 和 `extern SEACAVE::CConfigTable oConfig;` 是在命名空间中声明的两个变量。`extern` 关键字表示这些变量将在其他地方定义,而不是在这个命名空间中定义。
- `SEACAVE::VoidArr` 和 `SEACAVE::CConfigTable` 是类型的名称,可能是从外部库引入的。

使用这个宏,您可以创建一个命名空间(如 `OPTDENSE`),并在其中声明一些函数和变量。然后,您可以在程序中使用该命名空间中的函数和变量。这有助于将相关的功能和数据组织到一个独立的命名空间中,以提高代码的可维护性和可读性。

List.h

1256-1270( _Grow )

这段代码定义了一个 `_Grow` 函数,用于在动态数组的内部增加其容量,并进行内存的动态转移。以下是函数的主要操作:

1. 首先,函数接受一个参数 `newVectorSize`,表示新的数组容量。

2. 函数开始通过 `ASSERT` 宏来确保 `newVectorSize` 大于当前数组的容量 `_vectorSize`,这是为了保证容量只会增加而不会减少。

3. 接下来,函数计算了一个变量 `expoVectorSize`,它表示原 `_vectorSize` 增加了 50% 的容量,或者至少增加到 `newVectorSize`。这是为了防止每次都分配相同大小的内存,而是根据需要动态增加容量。

4. 然后,函数检查 `newVectorSize` 是否小于 `expoVectorSize`,如果是,则将 `newVectorSize` 设置为 `expoVectorSize`。这确保了新容量至少是 `_vectorSize` 的 1.5 倍。

5. 接下来,函数分配一个新的内存块 `_vector` 来存储新的数据,其大小为 `newVectorSize * sizeof(TYPE)` 字节,其中 `TYPE` 是数组中的元素类型。

6. 函数调用 `_ArrayMoveConstruct<true>` 来将旧的数据从 `tmp` 复制到新的内存块 `_vector` 中,这个过程包括移动构造,以便在移动数据时节省资源。移动构造通常是为了提高性能,减少内存拷贝操作。

7. 接下来,函数更新 `_vectorSize` 为新的容量 `newVectorSize`。

8. 最后,函数使用 `operator delete[]` 释放旧的内存块 `tmp`,以避免内存泄漏。

这个函数用于在需要时增加动态数组的容量,以确保数组可以容纳更多的数据。它通过分配新的内存块、复制数据和释放旧内存块来实现这一目标。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值