Mayavi: Rendering layar mati Mayavi tidak berfungsi untuk VTK 7.1.0

Dibuat pada 18 Jan 2017  ·  21Komentar  ·  Sumber: enthought/mayavi

Saya menggunakan vtk dengan driver MesaOS karena saya ingin menjalankan rendering sebagai bagian dari notebook jupyter dalam mode tanpa kepala, beberapa detail lebih lanjut untuk konfigurasi paket dapat ditemukan di sini:
https://github.com/conda-forge/vtk-feedstock/issues/20

Ketika saya menggunakan contoh layar VTK itu berfungsi dengan baik:

#! ./local/bin/python

from vtk import (vtkSphereSource, vtkPolyDataMapper, vtkActor, vtkRenderer,
        vtkRenderWindow, vtkWindowToImageFilter, vtkPNGWriter)

sphereSource = vtkSphereSource()
mapper = vtkPolyDataMapper()
mapper.SetInputConnection(sphereSource.GetOutputPort())

actor = vtkActor()
actor.SetMapper(mapper)

renderer = vtkRenderer()
renderWindow = vtkRenderWindow()
renderWindow.SetOffScreenRendering(1)
renderWindow.AddRenderer(renderer)

renderer.AddActor(actor)
renderer.SetBackground(1, 1, 1)

renderWindow.Render()

windowToImageFilter = vtkWindowToImageFilter()
windowToImageFilter.SetInput(renderWindow)
windowToImageFilter.Update()

writer = vtkPNGWriter()
writer.SetFileName("sphere.png")
writer.SetInputConnection(windowToImageFilter.GetOutputPort())
writer.Write()

Tetapi ketika saya menguji contoh mayavi off screen, itu tidak berfungsi:

# Author: Prabhu Ramachandran <[email protected]>
# Copyright (c) 2007, Enthought, Inc.
# License: BSD Style.

from os.path import join, abspath, dirname

# The offscreen Engine.
from mayavi.api import OffScreenEngine

# Usual MayaVi imports
from mayavi.scripts.util import get_data_dir
from mayavi.sources.api import VTKXMLFileReader
from mayavi.modules.api import Outline, ScalarCutPlane, Streamline


def main():
    # Create the MayaVi offscreen engine and start it.
    e = OffScreenEngine()
    # Starting the engine registers the engine with the registry and
    # notifies others that the engine is ready.
    e.start()

    # Create a new scene.
    win = e.new_scene()

    # Now setup a normal MayaVi pipeline.
    src = VTKXMLFileReader()
    src.initialize(join(get_data_dir(dirname(abspath(__file__))),
                        'fire_ug.vtu'))
    e.add_source(src)
    e.add_module(Outline())
    e.add_module(ScalarCutPlane())
    e.add_module(Streamline())
    win.scene.isometric_view()
    # Change the size argument to anything you want.
    win.scene.save('offscreen.png', size=(800, 800))


if __name__ == '__main__':
    main()

Pesan kesalahan yang saya dapatkan adalah:

ERROR: In ../Rendering/OpenGL2/vtkXOpenGLRenderWindow.cxx, line 301
vtkXOpenGLRenderWindow (0x30ced20): bad X server connection. DISPLAY=Aborted

Jadi bagi saya sepertinya inisialisasi layar tidak diteruskan dengan benar ke VTK. Sayangnya saya tidak dapat menemukan inisialisasi VTK di dalam mayavi sendiri. Bagi saya itu tampaknya terjadi di tvtk_access.py , saya masih tidak melihat opsi untuk memaksa rendering di luar layar secara langsung.

Komentar yang paling membantu

Saya memiliki masalah yang hampir sama ketika menggunakan Mayavi di Jupyter-Notebook yang disediakan oleh server Jupyter-Hub jarak jauh. Masalahnya adalah tidak ada X Server yang berjalan.

Saya menyelesaikannya dengan menginstal xvfbwrapper dan back-end Xvfb. Sebelum melakukan apa pun dengan mayavi, mulai Tampilan.

Contoh

#The following 3 lines must be before doing anything with mayavi (even importing)
from xvfbwrapper import Xvfb
vdisplay = Xvfb(width=1920, height=1080)
vdisplay.start()

from mayavi import mlab
mlab.init_notebook()
s = mlab.test_plot3d()
s

Jika tidak ada cara yang lebih elegan, saya pikir akan lebih baik untuk menyebutkan ini di manual.

Semua 21 komentar

Saya menemukan bahwa dengan menyetel ETS_TOOLKIT='null' saya dapat mereproduksi kesalahan ini menggunakan:

>>> from mayavi import mlab
>>> mlab.options.offscreen = True
>>> mlab.test_plot3d()
ERROR: In ../Rendering/OpenGL2/vtkXOpenGLRenderWindow.cxx, line 301
vtkXOpenGLRenderWindow (0x2e027d0): bad X server connection. DISPLAY=Aborted (core dumped)

Jika ETS_TOOLKIT='null' tidak disetel, bahkan impor pun tidak berfungsi. Jadi untuk sementara script di atas gagal saat saya mencoba membuat scene new_scene()

@jan-janssen -- Bisakah Anda menguji dengan master terbaru, itu harus diperbaiki sekarang. Anda masih membutuhkan export ETS_TOOLKIT=null tetapi sisanya akan berfungsi sekarang.

Saya telah menguji ini menggunakan paket osmesa conda-forge vtk dan saya tidak dapat membuatnya bekerja tanpa server X. Saya pikir saya memiliki pengaturan env dengan benar.

Apa yang saya lakukan adalah:

$ export ETS_TOOLKIT='null'
$ conda create -n mayavi_osmesa -c conda-forge mesalib pyqt numpy vtk
$ pip install git+https://github.com/enthought/mayavi
$ python -c "from mayavi import mlab; mlab.options.offscreen=True; mlab.test_plot3d(); mlab.savefig('test.png')"
ERROR: In ../Rendering/OpenGL2/vtkXOpenGLRenderWindow.cxx, line 445
vtkXOpenGLRenderWindow (0x1c58c80): bad X server connection. DISPLAY=Aborted (core dumped)

ok sebenarnya contoh VTK murni yang diberikan di OP juga tidak berfungsi, jadi saya berasumsi ada yang salah dengan env saya. Saya mendapatkan hal yang sama dengan pip install git+https://github.com/enthought/mayavi lurus jadi saya berasumsi saya kehilangan sesuatu di vtk di suatu tempat.

Terima kasih atas pengujiannya, dapatkah Anda memeriksa apakah VTK yang diinstal memiliki vtkOSOpenGLRenderWindow , yaitu
import vtk; print(hasattr(vtk, 'vtkOSOpenGLRenderWindow')) . Jika tidak, VTK mungkin tidak dibuat dengan dukungan osmesa. Jika ya, saya perlu menyelidikinya dengan cermat.

Ini tidak memiliki itu. Saya kira Anda tidak tahu apa yang mengontrol jika itu ada atau tidak?!

Ketika VTK dibangun, Anda perlu mengatur VTK_OPENGL_HAS_OSMESA ke ON.

hmmm, sejauh yang saya tahu paket conda-forge osmesa harus melakukan itu. Saya akan membuka masalah di sana.

Saya pikir rilis mesa yang lebih baru tidak mengizinkan mesa dan osmesa sehingga rilis VTK terbaru dapat secara otomatis mematikan osmesa ketika vtk_use_x dihidupkan. Tapi saya tidak sepenuhnya yakin tentang ini karena banyak hal bisa berubah ...

Jika memungkinkan, bisakah Anda mencoba dengan versi yang lebih lama seperti VTK-7.x atau kapan pun ini diketahui berhasil?

Saya mengalami pesan kesalahan yang sama di Ubuntu 18, vtk 8.1.2, mayavi 4.6.2

Saya juga mengalami masalah ini dengan mayavi. Apakah ada yang menemukan solusi? Saya mengalami masalah ini saat menggunakan mayavi di server, meskipun saya memiliki tampilan yang diteruskan ke komputer lokal saya.

Saya memiliki masalah yang hampir sama ketika menggunakan Mayavi di Jupyter-Notebook yang disediakan oleh server Jupyter-Hub jarak jauh. Masalahnya adalah tidak ada X Server yang berjalan.

Saya menyelesaikannya dengan menginstal xvfbwrapper dan back-end Xvfb. Sebelum melakukan apa pun dengan mayavi, mulai Tampilan.

Contoh

#The following 3 lines must be before doing anything with mayavi (even importing)
from xvfbwrapper import Xvfb
vdisplay = Xvfb(width=1920, height=1080)
vdisplay.start()

from mayavi import mlab
mlab.init_notebook()
s = mlab.test_plot3d()
s

Jika tidak ada cara yang lebih elegan, saya pikir akan lebih baik untuk menyebutkan ini di manual.

@ max9111 apakah Anda ingat melakukan hal lain? Saya mencoba kode Anda setelah menginstal xvfbwrapper . Tetapi setelah ssh'ing ke server saya menggunakan flag -X, saya masih mendapatkan kesalahan:

GALAT: Di ../Rendering/OpenGL2/vtkXOpenGLRenderWindow.cxx, baris 606
vtkXOpenGLRenderWindow (0x55b43e61d590): Tidak dapat membuat konteks GLX. Aborsi.

@tjiagoM Mungkin Anda lupa menginstal xfb itu sendiri (Sudo apt-get install xvfb)?

@ max9111 oh, tidak, awalnya saya membuat kesalahan itu tetapi mereka akan membuat kesalahan yang mengatakan bahwa tidak ada xvfb yang ditemukan/aktif (atau yang serupa)

@ max9111 Saya berjuang dengan pengaturan yang sama, mayavi di jupyterhub jarak jauh. Apakah Anda memiliki contoh gambar buruh pelabuhan yang digunakan oleh hub? Saya mencoba menggunakan xvfbwrapper seperti yang Anda sarankan tetapi tidak berhasil untuk saya. Terima kasih sebelumnya!

@mirestrepo
Sayangnya tidak memiliki gambar buruh pelabuhan.

Pengaturan saya adalah:

  • Mesin virtual yang berjalan di Kubuntu 18.04 (menggunakan Kotak Virtual) pada Workstation jarak jauh yang berjalan di CentOS7.

  • Menginstal JupyterHub Terkecil

  • Jadikan Jupyterhub tersedia dari luar (Penerusan port, Pengaturan Firewall)

  • Menginstal XfVB di mesin virtual seperti itu
    Poin penting di sini adalah untuk mendapatkan X-Server yang berfungsi (jadi tutorial umum bagaimana melakukan sesuatu yang terkait GUI dalam gambar Docker mungkin juga membantu) Saya sarankan mencoba skrip sederhana dari tautan untuk memeriksa ini. Dalam hal ini Anda juga akan mendapatkan pesan kesalahan yang berarti.

  • Jika ini berhasil, penting bagi Anda untuk memulai X-Server sebelum melakukan hal-hal terkait mayavi, seperti yang ditunjukkan pada contoh di atas. Jika Anda mengimpor mayavi from mayavi import mlab sebelum menginisialisasi X-Server mayavi akan crash.

@ max9111 Saya berhasil melewati pembungkus xvfb dengan meluncurkan xvfb pada titik masuk untuk buruh pelabuhan saya ENTRYPOINT ["tini", "-g", "--", "xvfb-run"] tetapi saya hanya bisa mendapatkan mlab untuk bekerja dengan png backend... Saya belum mencoba membangun vtk dengan OSMesa ...

xvfb-run dapat membantu Anda:

 xvfb-run python your-py-script.py

Catatan Anda perlu menginstal xvfb sebelum menjalankan perintah di atas.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

Kekushke picture Kekushke  ·  9Komentar

aestrivex picture aestrivex  ·  9Komentar

GaelVaroquaux picture GaelVaroquaux  ·  13Komentar

igamenovoer picture igamenovoer  ·  7Komentar

rambalachandran picture rambalachandran  ·  9Komentar