2.视差图
在摄像机标定之后,视差图生成是设计流程中的下一步。视差图是在PYNQ板创建和计时,在CPU中进行验证的。最初的目标是从两个摄像机产生立体视觉。由于缺乏对立体摄像机的直接访问,一个解决办法是尝试生成伪立体视频。将输入的视频分成两部分,虚拟地创建立体视觉并生成视差图。虽然生成的地图不会非常精确,但这里的目的是评估3D构建算法如何在实时立体输入上工作。OpenCV内置的生成视差图的函数被用于加速管道的开发,在未来的工作中将使用压缩输入帧的方法或现有的3D云生成算法(visualfm、OpenMVS)等。有很多这样的工具可用,但它们是计算密集型的,只运行后期记录,而不是实时的,以验证对
FPGA的需求。为了测试立体图像的质量,使用了芦荟的立体图像数据集。这个过程是在PYNQ板上计时的,它花了12.531396秒,所以这对于实时视频是不可行的。未来将设计一个自定义覆盖来解决这个问题。然而,视差图是在PYNQ板上生成,在PC上验证精度,如下图所示。
3.3D点云
3D点云是使用相关的内置OpenCV函数生成的。为了与下一节中实现的自定义方法进行比较,使用Mesh Lab可视化三维点云。从下图可以看出,渲染是准确的。使用PYNQ板生成3D点云耗时42.973997秒。这说明视差图和点云生成是三维模型实时生成的瓶颈。为这两个OpenCV函数创建一个覆盖层也是这个项目未来工作的一部分。
4.3D到2D投影
生成投影2D图像的方法首先从生成的3D密集点云开始。3D点云可以视为有关模型的所有必需信息。它包含位置信息;X、Y、Z坐标以及颜色信息;红色、绿色、蓝色强度。为了正确测试函数,首先生成一个简单的立方体,其中8个点代表对象上的每个角。这种结构随后被用于旋转和平移功能。立方体在所有3个轴上独立旋转,能够以所需的位置和颜色将所有点输出到屏幕。先前生成的三维密集点云提供了每个点的X、Y、Z坐标和RGB颜色,因此旋转和平移矩阵可以直接应用于此。对于当前的实现,决定使用单个输入帧,并将其旋转以查看一系列输出帧中的投影。这可以改变为一个输入图像流,即视频,其视图可以是恒定的,甚至可以是围绕它旋转的。转换完成后,最终输出帧保存到变量中。在生成输出帧时,完全可以直接查看输出帧,但在笔记本电脑上,结果将是大约3-5秒的新帧。
笔记本电脑的结果是大约3-5秒的新帧。芦荟示例图像包含超过23万个要计算的单独点。使用一台带有i5处理器的笔记本电脑,在1轴上旋转然后投射大约需要102.5秒才能产生10个输出帧。在PYNQ处理器上运行时,速度明显较慢,因此必须对问题进行显著的重新调整。为此,问题大小将减少到2300点作为输入。这为进程的运行提供了一个可接受的时间框架,单个输出帧需要14.7秒。这种低性能有几个原因。
没有为这个代码编写数据处理过程。这意味着数据是以线性方式为线路板获取的,而不是利用并行缓冲区。这可以解释为什么板处理器比使用DSP块更快。
通信,即在板上CPU和FPGA之间传输的数据比实际的硬件加速要长。
在3帧的并行运算中,只有3帧的乘法运算是完全相反的。这意味着所使用的27个块同时使用,但要完成一个单独的旋转和投影,则需要在每次计算中单独重用这些块。也只有对每个点单独进行处理,没有并行计算的点。
以下是二维平面上旋转和投影模型的输出示例。
PYNQ板上的实时3D建模是该项目背后的主要动机。我们意识到,在整个3D建模流程中有很多优化是可能的,但完全优化不在本项目的范围之内。然而,管道的不同部分采用了不同的改进方法。实验证明,PYNQ板的可移植性和并行计算能力使其成为实时3D建模的理想候选。作者们希望这将激励更多的开发人员致力于实际应用,如无人机绘图或GoPro用于移动摄影测量。Python平台使这类应用程序的原型化变得非常容易,而且PYNQ的未来充满了有趣的可能性。
`