通常来说这个是交给软件处理的,可是并没有找到合适的软件,另外海量的激光点云加上海量无序影像,实际上也不一定有软件支持无序数据的颜色映射,因此通过代码对颜色映射进行了实现,在实现的过程中主要考虑数据量大小的问题,通常来说原始激光点云数据数据量大小超过1GB,而我们获取的影像分辨率为0.025m,单幅影像数据在300MB左右,一条航带存在上千幅影像,数据量巨大,如何能够在此数据量的条件下实现快速颜色映射得到具有RGB颜色的点云数据是我们在这里要探讨的问题,主要的讨论点如下:

  • 1.数据取舍和数据量的压缩问题;
  • 2.点云颜色映射的正算和反算问题;

解决了以上两个问题,则海量点云影像的颜色映射就不存在问题了,那么我们首先来解决我们面临的第一个问题,也是实现的过程中的重点和难点.首先如此海量的数据放在内存中是肯定不合适的,对于个人PC机来说内存量远远小于我们的数据量,不可能将所有的数据都读取到内存.一个个点的读取也是不合适的,我们知道硬盘SATA接口的读取速度是有限且独占的,因此频繁的IO和内存的申请和释放的操作会使得程序的效率下降得十分厉害,因此单个单个点的读取也是不予考虑的;在实际处理过程中我们每一次IO读取大约100W个点,进行一轮IO操作,至于这个点的个数实际上根据内存的大小来确定,我们每一个点的结构体大约占用34个字节,则10w个点所占的内存为40MB,另外我们每次最大需要缓存一张影像所有数据,大约为300MB,实际上内存申请量比较大了,由于需要进行频繁的内存申请和释放,因此建议通过内存池对内存进行管理,减小内存碎片,提高内存的利用率.
解决了内存的问题我们接下来面临的问题就是处理效率的问题,实际上由于点云和影像数据量极大,因此采用遍历的方式一定不是最佳的方式,我们采用外包矩形求交集的方式进行处理,我们获取点云的patch的同时可以获取点云的外包矩形,实际上应该是最小外包矩形,为了简单我直接采用外包矩形,另外对于与之相同坐标系的影像我们同样能够获取其范围矩形,通过判断交集我们可以知道两个矩形是否存在交集,若存在交集,则进行颜色映射,另外为了避免重复颜色映射,我们给每一个点一个标记位,若标记位为真则表示该点已经有颜色,如果该patch中所有点都赋色完成,或已经遍历所有影像,则说明该patch赋色完成,将patch中的点云写入文件处理下一个patch.
解决了内存的问题,则关于点云映射的正反解的问题就相对比较简单了,在已知6参数的基础上根据影像坐标解算对应的地面点坐标以及根据地面点坐标解算影像坐标,这两个过程简单来说就是求解一个二元一次方程组的过程,实际上影像经过校正后都是朝着正北方向,因此整个过程就更加简单了,实际上处理好了大数据量的问题和颜色映射的正反解问题后,整个颜色映射的过程就十分简单了.
另外有一个小小的问题需要注意,在x86的程序中只能够进行4GB数据的跳转,如果要进行更大量数据的跳转则需要分别通过高位和低位进行组合实现,因此建议使用x64位的代码对数据进行处理以免出现由于数据量过大导致文件无法寻址的问题.这里只提了点云处理的问题,实际上对于点云数据处理,可能数据的IO才是更加重要的一部分,关于点云的IO我在这一方面有着一定的研究,我会单独抽出一篇文章来对点云IO以及其程序的构架进行深入的分析.