无头渲染
本教程讲解如何在没有任何显示设备的终端中渲染并保存图像。
安装 OSMesa
Section titled “安装 OSMesa”要生成无头(headless)上下文,需要安装 OSMesa。
$ sudo apt-get install libosmesa6-dev安装 virtualenv
Section titled “安装 virtualenv”为 Python 创建一个虚拟环境。
$ sudo apt-get install virtualenv python-pip$ virtualenv -p /usr/bin/python3 py3env$ source py3env/bin/activate(py3env)$ pip install numpy matplotlib这段脚本会安装并激活 py3env。所需模块 numpy 和 matplotlib 被安装到 py3env 中。
用 OSMesa 编译 Open3D
Section titled “用 OSMesa 编译 Open3D”切换到 build 文件夹。
(py3env)$ cd ~/Open3D/(py3env)$ mkdir build && cd build下一步需要指定两个 CMake 标志。
-DENABLE_HEADLESS_RENDERING=ON:该标志告知 glew 和 glfw 应使用 OSMesa。-DUSE_SYSTEM_GLEW=OFF -DUSE_SYSTEM_GLFW=OFF:注意,无头渲染仅适用于 glew 2.1 和 glfw 3.3-dev 版本。在大多数情况下,原版 Ubuntu 系统并未安装这些版本。使用这些 CMake 选项可强制从 Open3D 自带的源码编译 glew 2.1 和 glfw 3.3-dev。
基于 Filament 的 GUI 实现与无头渲染不兼容,请设置 -DBUILD_GUI=OFF。在使用 -DBUILD_GUI=OFF 时,还必须同时禁用 webRTC 支持,即加上 -DBUILD_WEBRTC=OFF。
因此,cmake 命令如下:
(py3env)$ cmake -DENABLE_HEADLESS_RENDERING=ON \ -DBUILD_GUI=OFF \ -DBUILD_WEBRTC=OFF \ -DUSE_SYSTEM_GLEW=OFF \ -DUSE_SYSTEM_GLFW=OFF \ ..如果 cmake 成功生成了 makefile,就开始编译 Open3D。
(py3env)$ make -j$(nproc)(py3env)$ make install-pip-package测试无头渲染
Section titled “测试无头渲染”最后一步,运行一个会保存深度和表面法向量序列的 Python 脚本来测试。
(py3env)$ cd ~/Open3D/examples/python/visualization(py3env)$ python headless_rendering.py这应当会打印出如下内容:
Capture image 00000Capture image 00001Capture image 00002Capture image 00003Capture image 00004Capture image 00005:Capture image 00030渲染出的图像位于 ~/Open3D/examples/test_data/depth 和 image 文件夹中。
可能出现的问题
Section titled “可能出现的问题”无头模式下的 Ubuntu 16.04
Section titled “无头模式下的 Ubuntu 16.04”对于 Ubuntu 16.04,需要从源码构建一个 OSMesa 版本。首先按照上文《安装 virtualenv》的说明操作,然后按照下文《从源码编译 OSMesa》的说明进行。
从源码编译 OSMesa
Section titled “从源码编译 OSMesa”下面是编译 mesa-19.0.8 的说明,这是最后一个仍支持 ./configure 的版本:
# install llvm-8(py3env)$ sudo apt install llvm-8
# download OSMesa 19.0.8 release(py3env)$ curl -O https://mesa.freedesktop.org/archive/mesa-19.0.8.tar.xz(py3env)$ tar xvf mesa-19.0.8.tar.xz(py3env)$ cd mesa-19.0.8(py3env)$ LLVM_CONFIG="/usr/bin/llvm-config-8" ./configure --prefix=$HOME/osmesa \ --disable-osmesa --disable-driglx-direct --disable-gbm --enable-dri \ --with-gallium-drivers=swrast --enable-autotools --enable-llvm --enable-gallium-osmesa(py3env)$ make -j$(nproc)(py3env)$ make install# this installed OSMesa libraries to $HOME/osmesa/lib; in order for Open3D to pick it up# LD_LIBRARY_PATH needs to be updated to include it:(py3env)$ export LD_LIBRARY_PATH="$HOME/osmesa/lib:$LD_LIBRARY_PATH"# this needs to be done for every shell, or you can add it to your .bashrc(py3env)$ cd ~/Open3D(py3env)$ mkdir build && cd build(py3env)$ cmake -DENABLE_HEADLESS_RENDERING=ON -DUSE_SYSTEM_GLEW=OFF -DUSE_SYSTEM_GLFW=OFF \ -DOSMESA_INCLUDE_DIR=$HOME/osmesa/include -DOSMESA_LIBRARY="$HOME/osmesa/lib/libOSMesa.so" \ ..(py3env)$ make -j$(nproc)(py3env)$ make install-pip-package现在你可以按照《测试无头渲染》一节中的说明进行操作。