Skip to content

无头渲染

本教程讲解如何在没有任何显示设备的终端中渲染并保存图像。

要生成无头(headless)上下文,需要安装 OSMesa。

Terminal window
$ sudo apt-get install libosmesa6-dev

为 Python 创建一个虚拟环境。

Terminal window
$ 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 中。

切换到 build 文件夹。

Terminal window
(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 命令如下:

Terminal window
(py3env)$ cmake -DENABLE_HEADLESS_RENDERING=ON \
-DBUILD_GUI=OFF \
-DBUILD_WEBRTC=OFF \
-DUSE_SYSTEM_GLEW=OFF \
-DUSE_SYSTEM_GLFW=OFF \
..

如果 cmake 成功生成了 makefile,就开始编译 Open3D。

Terminal window
(py3env)$ make -j$(nproc)
(py3env)$ make install-pip-package

最后一步,运行一个会保存深度和表面法向量序列的 Python 脚本来测试。

Terminal window
(py3env)$ cd ~/Open3D/examples/python/visualization
(py3env)$ python headless_rendering.py

这应当会打印出如下内容:

Capture image 00000
Capture image 00001
Capture image 00002
Capture image 00003
Capture image 00004
Capture image 00005
:
Capture image 00030

渲染出的图像位于 ~/Open3D/examples/test_data/depth 和 image 文件夹中。

对于 Ubuntu 16.04,需要从源码构建一个 OSMesa 版本。首先按照上文《安装 virtualenv》的说明操作,然后按照下文《从源码编译 OSMesa》的说明进行。

下面是编译 mesa-19.0.8 的说明,这是最后一个仍支持 ./configure 的版本:

Terminal window
# 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

现在你可以按照《测试无头渲染》一节中的说明进行操作。