######################################################################## # # Copyright (c) 2022, STEREOLABS. # # All rights reserved. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ######################################################################## """ This sample demonstrates how to capture a live 3D point cloud with the ZED SDK and display the result in an OpenGL window. """ import sys import ogl_viewer.viewer as gl import pyzed.sl as sl import argparse def parse_args(init, opt): if len(opt.input_svo_file)>0 and opt.input_svo_file.endswith((".svo", ".svo2")): init.set_from_svo_file(opt.input_svo_file) print("[Sample] Using SVO File input: {0}".format(opt.input_svo_file)) elif len(opt.ip_address)>0 : ip_str = opt.ip_address if ip_str.replace(':','').replace('.','').isdigit() and len(ip_str.split('.'))==4 and len(ip_str.split(':'))==2: init.set_from_stream(ip_str.split(':')[0],int(ip_str.split(':')[1])) print("[Sample] Using Stream input, IP : ",ip_str) elif ip_str.replace(':','').replace('.','').isdigit() and len(ip_str.split('.'))==4: init.set_from_stream(ip_str) print("[Sample] Using Stream input, IP : ",ip_str) else : print("Unvalid IP format. Using live stream") if ("HD2K" in opt.resolution): init.camera_resolution = sl.RESOLUTION.HD2K print("[Sample] Using Camera in resolution HD2K") elif ("HD1200" in opt.resolution): init.camera_resolution = sl.RESOLUTION.HD1200 print("[Sample] Using Camera in resolution HD1200") elif ("HD1080" in opt.resolution): init.camera_resolution = sl.RESOLUTION.HD1080 print("[Sample] Using Camera in resolution HD1080") elif ("HD720" in opt.resolution): init.camera_resolution = sl.RESOLUTION.HD720 print("[Sample] Using Camera in resolution HD720") elif ("SVGA" in opt.resolution): init.camera_resolution = sl.RESOLUTION.SVGA print("[Sample] Using Camera in resolution SVGA") elif ("VGA" in opt.resolution): init.camera_resolution = sl.RESOLUTION.VGA print("[Sample] Using Camera in resolution VGA") elif len(opt.resolution)>0: print("[Sample] No valid resolution entered. Using default") else : print("[Sample] Using default resolution") def main(opt): print("Running Depth Sensing sample ... Press 'Esc' to quit\nPress 's' to save the point cloud") # Determine memory type based on CuPy availability and user preference use_gpu = gl.GPU_ACCELERATION_AVAILABLE and not opt.disable_gpu_data_transfer mem_type = sl.MEM.GPU if use_gpu else sl.MEM.CPU if use_gpu: print("🚀 Using GPU data transfer with CuPy") init = sl.InitParameters(depth_mode=sl.DEPTH_MODE.NEURAL, coordinate_units=sl.UNIT.METER, coordinate_system=sl.COORDINATE_SYSTEM.RIGHT_HANDED_Y_UP) parse_args(init, opt) zed = sl.Camera() status = zed.open(init) if status > sl.ERROR_CODE.SUCCESS: print(repr(status)) exit() res = sl.Resolution() res.width = -1 res.height = -1 # Get the first PC to retrieve the resolution point_cloud = sl.Mat() zed.retrieve_measure(point_cloud, sl.MEASURE.XYZRGBA, mem_type, res) res = point_cloud.get_resolution() # Create OpenGL viewer viewer = gl.GLViewer() viewer.init(1, sys.argv, res) while viewer.is_available(): if zed.grab() <= sl.ERROR_CODE.SUCCESS: # Retrieve point cloud data using the optimal memory type (GPU if CuPy available) zed.retrieve_measure(point_cloud, sl.MEASURE.XYZRGBA, mem_type, res) viewer.updateData(point_cloud) if viewer.save_data: # For saving, we take CPU memory regardless of processing type point_cloud_to_save = sl.Mat() zed.retrieve_measure(point_cloud_to_save, sl.MEASURE.XYZRGBA, sl.MEM.CPU) err = point_cloud_to_save.write('Pointcloud.ply') if(err == sl.ERROR_CODE.SUCCESS): print("Current .ply file saving succeed") else: print("Current .ply file failed") viewer.save_data = False viewer.exit() zed.close() if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument('--input_svo_file', type=str, help='Path to an .svo file, if you want to replay it',default = '') parser.add_argument('--ip_address', type=str, help='IP Adress, in format a.b.c.d:port or a.b.c.d, if you have a streaming setup', default = '') parser.add_argument('--resolution', type=str, help='Resolution, can be either HD2K, HD1200, HD1080, HD720, SVGA or VGA', default = '') parser.add_argument('--disable-gpu-data-transfer', action='store_true', help='Disable GPU data transfer acceleration with CuPy even if CuPy is available') opt = parser.parse_args() if len(opt.input_svo_file)>0 and len(opt.ip_address)>0: print("Specify only input_svo_file or ip_address, or none to use wired camera, not both. Exit program") exit() main(opt)