Open3d: non-blocking λ“œλ‘œμž‰ λ£¨ν”„μ—μ„œ draw_geometries ()λ₯Ό ν˜ΈμΆœν•˜λ©΄ non-blocking λ“œλ‘œμž‰μ΄ μ€‘λ‹¨λ©λ‹ˆλ‹€.

에 λ§Œλ“  2018λ…„ 10μ›” 04일  Β·  4μ½”λ©˜νŠΈ  Β·  좜처: intel-isl/Open3D

non_blocking_visualisation.py 예제λ₯Ό κ³ λ €ν•˜μ‹­μ‹œμ˜€.
μš°λ¦¬κ°€ μ „ν™”ν•˜λ©΄

draw_geometries([source_raw]) 

이후 μ–Έμ œλ“ μ§€

    vis = Visualizer()
    vis.create_window()

draw_geometriesλ₯Ό μ’…λ£Œ ν•œ ν›„ visλ₯Ό μ‚¬μš©ν•˜λ €κ³ ν•˜λ©΄ λ‹€μŒ 였λ₯˜κ°€ 좜λ ₯λ©λ‹ˆλ‹€.

GLFW 였λ₯˜ : GLFW λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

κ·Έ μ΄ν›„μ—λŠ” vis 창에 아무것도 ν‘œμ‹œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λΉ„ 차단 λ°©μ‹μœΌλ‘œ 포인트 ν΄λΌμš°λ“œλ₯Ό ν‘œμ‹œν•˜λŠ” μ•±μ—μ„œμ΄ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 디버깅 ν•  λ•Œ 쀑간 κ²°κ³Όλ₯Ό ν‘œμ‹œν•˜κΈ° μœ„ν•΄ ipython μΈν„°ν”„λ¦¬ν„°μ—μ„œ draw_geometries ()λ₯Ό 자주 ν˜ΈμΆœν•©λ‹ˆλ‹€. λ¬Έμ œλŠ” ν˜„μž¬μ΄ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©΄ λΉ„ 차단 μ‹œκ°ν™”κ°€ μž‘λ™μ„ 멈좀으둜써 앱을 계속할 수 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λΉ„ 차단 μ‹œκ°ν™”λ₯Ό λ‹€μ‹œ 보렀면 앱을 λ‹€μ‹œ μ‹œμž‘ν•΄μ•Όν•©λ‹ˆλ‹€.

이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ ν•  μˆ˜μžˆλŠ” 일이 μžˆμŠ΅λ‹ˆκΉŒ?

possible bug

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ‹€μŒκ³Ό 같이 del vis μΆ”κ°€ :

vis.destroy_window()
del vis

λͺ¨λ“  4 λŒ“κΈ€

μ•ˆλ…•ν•˜μ„Έμš” @martinakos. draw_geometries 은 κ³ κΈ‰ κΈ°λŠ₯μž…λ‹ˆλ‹€. 창을 λ§Œλ“€κ³  λ„ν˜•μ„ μΆ”κ°€ν•©λ‹ˆλ‹€. draw_geometries λ₯Ό lop 내뢀에 λ„£μœΌλ©΄ λ™μ‹œμ— λ§Žμ€ 창이 λ§Œλ“€μ–΄μ§€κ³  λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•΄κ²° 방법은 Visualizer () 클래슀λ₯Ό μ •μ˜ν•˜κ³  λ‚΄λΆ€ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 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()

이 μŠ€ν¬λ¦½νŠΈλŠ” 결함없이 두 개의 화면을 ν‘œμ‹œν•©λ‹ˆλ‹€.

μ£„μ†‘ν•©λ‹ˆλ‹€. 잘 λͺ¨λ₯΄κ² λ„€μš”. 디버깅 λͺ©μ μœΌλ‘œ λŒ€ν™” ν˜• ν”„λ‘¬ν”„νŠΈμ—μ„œλ§Œ draw_geometries ()λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. 쀑단 μ μ—μ„œ 쀑지 된 λ™μ•ˆ 쀑간 μž‘μ—…μ΄ μ˜λ„ ν•œλŒ€λ‘œ μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν•˜κ³  λŒ€ν™”μ‹μœΌλ‘œ 검사 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ €λŠ” draw_geometries ()λ₯Ό numpy λ°°μ—΄μ—μ„œ λ§Žμ€ 포인트 ν΄λΌμš°λ“œλ₯Ό μƒμ„±ν•˜κ³  마컀λ₯Ό μΆ”κ°€ ν•  μˆ˜μžˆλŠ” ν•¨μˆ˜λ‘œ λž˜ν•‘ν–ˆμŠ΅λ‹ˆλ‹€. λŒ€ν™” ν˜• 디버깅에 맀우 νŽΈλ¦¬ν•©λ‹ˆλ‹€. λ¬Έμ œλŠ”μ΄ κΈ°λŠ₯을 μ‚¬μš©ν•˜λ©΄ λΉ„ 차단 μ‹œκ°ν™”κ°€ μ€‘λ‹¨λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. 이 μ˜ˆμ—μ„œ 두 μ°½ λͺ¨λ‘μ™€ μƒν˜Έ μž‘μš©ν•  수 μžˆμŒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. 이것은 μ’‹λ‹€.
κ·Έλž˜μ„œ μ½”λ“œλ₯Ό λ‚΄ μ‚¬μš© 사둀에 맞게 재 포μž₯ν•˜κ³  μ•„λž˜ ν…ŒμŠ€νŠΈλ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

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()

λ‚΄κ°€ μ›ν•˜λŠ” 것은 "if save_image"μ€„μ˜ 쀑단 μ μ—μ„œ μ½”λ“œλ₯Ό 쀑지 ν•  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 그런 λ‹€μŒμ΄ 쀄 μœ„μ˜ μ£Όμ„μ—μ„œ μ„€λͺ…ν•œλŒ€λ‘œ λŒ€ν™” ν˜• ν”„λ‘¬ν”„νŠΈμ—μ„œ λ‚΄ show_drawings (source)λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. 포인트 ν΄λΌμš°λ“œλ₯Ό κ²€μ‚¬ν•˜μ‹­μ‹œμ˜€. ESCλ₯Ό 눌러 창을 λ‹«μœΌμ‹­μ‹œμ˜€. 그런 λ‹€μŒ 슀크립트 싀행을 κ³„μ†ν•˜μ‹­μ‹œμ˜€. κ·ΈλŸ¬λ‚˜ μ–΄λ–€ 이유둜 window2λ₯Ό 닫을 λ•Œ ESCλ₯Ό λˆ„λ₯΄λ©΄ window1도 λ‹«νž™λ‹ˆλ‹€! λ‹€μŒμ— window1을 μ‚¬μš©ν•  λ•Œ "GLFW 였λ₯˜ : GLFW λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€"κ°€ λ‹€μ‹œ λ‚˜νƒ€λ‚©λ‹ˆλ‹€.

λ‚΄κ°€ μ˜λ„ ν•œ 것을 μ–΄λ–»κ²Œν•˜λŠ”μ§€ μ•„μ‹­λ‹ˆκΉŒ?

같은 증상이 λ³΄μž…λ‹ˆλ‹€. glfw window close μ΄λ²€νŠΈκ°€ λͺ¨λ“  창에 λΈŒλ‘œλ“œ μΊμŠ€νŠΈλ˜κ³ μžˆλŠ” 것 κ°™μ§€λ§Œ 아직이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법을 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같이 del vis μΆ”κ°€ :

vis.destroy_window()
del vis
이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰