Open3d: L'appel de draw_geometries () dans une boucle de dessin non bloquante interrompt le dessin non bloquant

Créé le 4 oct. 2018  ·  4Commentaires  ·  Source: intel-isl/Open3D

Prenons l'exemple de non_blocking_visualisation.py.
Si nous appelons

draw_geometries([source_raw]) 

à tout moment après

    vis = Visualizer()
    vis.create_window()

puis après avoir quitté draw_geometries, lorsque nous essayons d'utiliser vis, il imprime l'erreur suivante:

Erreur GLFW: la bibliothèque GLFW n'est pas initialisée

et rien n'apparaît dans la fenêtre de vis après ce point.

Je me retrouve dans ce scénario dans une application que je crée qui affiche des nuages ​​de points de manière non bloquante. Mais comme je le débogue, j'appelle souvent draw_geometries () depuis l'interpréteur ipython pour afficher des résultats intermédiaires. Le problème est que, pour le moment, si je fais cela, je ne peux pas continuer avec l'application, car la visualisation non bloquante cesse de fonctionner. Je dois redémarrer l'application pour voir à nouveau la visualisation non bloquante.

Y a-t-il quelque chose qui puisse être fait pour éviter cela?

possible bug

Commentaire le plus utile

ajoutez del vis comme ceci:

vis.destroy_window()
del vis

Tous les 4 commentaires

Salut @martinakos. draw_geometries est une fonction de haut niveau - elle crée une fenêtre et ajoute des géométries. Si vous mettez draw_geometries à l'intérieur du lop, cela créera plusieurs fenêtres simultanément et peut causer des problèmes.

La solution de contournement consiste à définir la classe Visualizer () et à utiliser des fonctions internes. Permettez-moi de prendre un exemple en utilisant non_blocking_visualisation.py:

    vis = Visualizer()
    vis.create_window()
    vis.add_geometry(source)
    vis.add_geometry(target)
    threshold = 0.05
    icp_iteration = 100
    save_image = False

    ##################
    # this is to display the second example
    vis2 = Visualizer()
    vis2.create_window()
    vis2.add_geometry(source) # replace your geometry
    ##################

    for i in range(icp_iteration):
        reg_p2l = registration_icp(source, target, threshold,
                np.identity(4), TransformationEstimationPointToPlane(),
                ICPConvergenceCriteria(max_iteration = 1))
        source.transform(reg_p2l.transformation)
        vis.update_geometry()
        vis.poll_events()
        vis.update_renderer()

        ##################
        # this is to display the second example
        vis2.update_geometry()
        vis2.poll_events()
        vis2.update_renderer()
        ##################

        if save_image:
            vis.capture_screen_image("temp_%04d.jpg" % i)
    vis.destroy_window()
    vis2.destroy_window()

Ce script affichera deux écrans sans problème.

Désolé, je pense que je n'ai pas été très clair. J'appelle uniquement draw_geometries () à partir de l'invite interactive, à des fins de débogage. Cela me permet de vérifier et d'inspecter de manière interactive que mes opérations intermédiaires fonctionnent comme je l'entends pendant qu'elles sont arrêtées à un point d'arrêt. J'ai enveloppé draw_geometries () avec une fonction qui crée un certain nombre de nuages ​​de points à partir de tableaux numpy et me permet d'ajouter des marqueurs. C'est très pratique pour le débogage interactif. Le problème est que si j'utilise cette fonction, ma visualisation non bloquante est interrompue.

Merci pour l'exemple. Je vois dans cet exemple que je peux interagir avec les deux fenêtres. C'est bon.
J'ai donc reconditionné le code dans mon cas d'utilisation et créé le test ci-dessous:

from open3d import *
import numpy as np
import copy


def show_drawings(source):

    vis2 = Visualizer()
    vis2.create_window(window_name='window2',width=640, height=480)
    vis2.add_geometry(source) # replace your geometry
    e = True
    while e:        
        vis2.update_geometry()
        e = vis2.poll_events()
        vis2.update_renderer()
    #vis2.destroy_window()                        
    return

if __name__ == "__main__":
    set_verbosity_level(VerbosityLevel.Debug)
    source_raw = read_point_cloud("../../TestData/ICP/cloud_bin_0.pcd")
    target_raw = read_point_cloud("../../TestData/ICP/cloud_bin_1.pcd")
    source = voxel_down_sample(source_raw, voxel_size = 0.02)
    target = voxel_down_sample(target_raw, voxel_size = 0.02)
    trans = [[0.862, 0.011, -0.507,  0.0],
            [-0.139, 0.967, -0.215,  0.7],
            [0.487, 0.255,  0.835, -1.4],
            [0.0, 0.0, 0.0, 1.0]]
    source.transform(trans)

    flip_transform = [[1, 0, 0, 0],
            [0, -1, 0, 0],
            [0, 0, -1, 0],
            [0, 0, 0, 1]]
    source.transform(flip_transform)
    target.transform(flip_transform)



    vis = Visualizer()
    vis.create_window(window_name='window1',width=640, height=480)                         
    vis.add_geometry(source)
    vis.add_geometry(target)
    threshold = 0.05
    icp_iteration = 100
    save_image = False    

    for i in range(icp_iteration):
        reg_p2l = registration_icp(source, target, threshold,
                np.identity(4), TransformationEstimationPointToPlane(),
                ICPConvergenceCriteria(max_iteration = 1))
        source.transform(reg_p2l.transformation)
        vis.update_geometry()
        vis.poll_events()
        vis.update_renderer()

        #At some point, while running, set a breakpoint here 
        #and in the interactive prompt call: show_drawings(source)
        #after inspecting, press ESC to close the window, 
        #and continue with the script.

        if save_image:
            vis.capture_screen_image("temp_%04d.jpg" % i)
    vis.destroy_window()

Ce que je voulais, c'est que je pourrais arrêter le code à un point d'arrêt à la ligne "if save_image"; puis comme expliqué dans le commentaire au-dessus de cette ligne, appelez mes show_drawings (source) dans une invite interactive; inspectez le nuage de points; fermez la fenêtre en appuyant sur ESC; puis continuez avec l'exécution du script. Cependant, pour une raison quelconque, lors de la fermeture de window2, en appuyant sur ESC, window1 est également fermée! et la prochaine fois que window1 est utilisé, "Erreur GLFW: La bibliothèque GLFW n'est pas initialisée" apparaîtra à nouveau.

Une idée comment faire ce que j'ai l'intention?

Je vois le même symptôme. Il semble que l'événement de fermeture de fenêtre glfw soit diffusé à toutes les fenêtres, mais je n'ai pas encore trouvé comment résoudre ce problème.

ajoutez del vis comme ceci:

vis.destroy_window()
del vis
Cette page vous a été utile?
0 / 5 - 0 notes