Need help for human body tracking with 02 ZED2i camera using simultaneously and synchronized

import pyzed.sl as sl
import cv2
import numpy as np
import threading
import time
import signal
import csv

zed_list = []
left_list = []
depth_list = []
timestamp_list = []
thread_list = []
stop_signal = False

def signal_handler(signal, frame):
    global stop_signal
    stop_signal=True
    time.sleep(0.5)
    exit()

def grab_run(index):
    global stop_signal
    global zed_list
    global timestamp_list
    global left_list
    global depth_list

    runtime = sl.RuntimeParameters()
    while not stop_signal:
        err = zed_list[index].grab(runtime)
        if err == sl.ERROR_CODE.SUCCESS:
            zed_list[index].retrieve_image(left_list[index], sl.VIEW.LEFT)
            zed_list[index].retrieve_measure(depth_list[index], sl.MEASURE.DEPTH)
            timestamp_list[index] = zed_list[index].get_timestamp(sl.TIME_REFERENCE.CURRENT).data_ns
        time.sleep(0.001) #1ms
    zed_list[index].close()
    
def main():


    # -----------------------------------------------------------------------------------#
    #                                 Multicamera code section 
    # -----------------------------------------------------------------------------------#
    global stop_signal
    global zed_list
    global left_list
    global depth_list
    global timestamp_list
    global thread_list
    global init_params_list

    signal.signal(signal.SIGINT, signal_handler)

    print("Running...")
    init = sl.InitParameters()
    init.camera_resolution = sl.RESOLUTION.HD720
    init.camera_fps = 30  # The framerate is lowered to avoid any USB3 bandwidth issues



    # -----------------------------------------------------------------------------------#
    #                                 Setting for Body Tracking 
    # -----------------------------------------------------------------------------------#

    obj_param = sl.ObjectDetectionParameters()
    # Different model can be chosen, optimizing the runtime or the accuracy
    obj_param.detection_model = sl.DETECTION_MODEL.HUMAN_BODY_ACCURATE
    obj_param.body_format = sl.BODY_FORMAT.POSE_34 
    obj_param.enable_tracking = True
    obj_param.image_sync = True
    obj_param.enable_mask_output = False
    # Optimize the person joints position, requires more computations
    obj_param.enable_body_fitting = True

    # -----------------------------------------------------------------------------------#
    #                                 Multi Code Section 
    # -----------------------------------------------------------------------------------#
    
    #List and open cameras
    name_list = []
    last_ts_list = []
    cameras = sl.Camera.get_device_list()
    print(cameras)
    time.sleep(2)
    index = 0
    for cam in cameras:
        init.set_from_serial_number(cam.serial_number)
        name_list.append("ZED {}".format(cam.serial_number))
        print("Opening {}".format(name_list[index]))
        zed_list.append(sl.Camera())
        left_list.append(sl.Mat())
        depth_list.append(sl.Mat())

        #init_params_list.append(sl.InitParameters())
        #init_params_list.camera_resolution = sl.RESOLUTION.HD720  
        #init_params_list.depth_mode = sl.DEPTH_MODE.PERFORMANCE
        #init_params_list.coordinate_units = sl.UNIT.METER
        #init_params_list.sdk_verbose = True

        timestamp_list.append(0)
        last_ts_list.append(0)
        status = zed_list[index].open(init)
        
        # -----------------------------------------------------------------------------------#
        #                                 body tracking code section 
        # -----------------------------------------------------------------------------------#

        #zed = sl.Camera()
        f = open('/home/icrs/vish_works/zed-examples/tutorials/vishwanath/alok1.csv', 'w')
        f = open('/home/icrs/vish_works/zed-examples/tutorials/vishwanath/alok2.csv', 'w')
        writer = csv.writer(f)
        
        init_params = sl.InitParameters()        
        init_params.camera_resolution = sl.RESOLUTION.HD720  # Use HD720 video mode
        init_params.depth_mode = sl.DEPTH_MODE.PERFORMANCE
        init_params.coordinate_units = sl.UNIT.METER
        init_params.sdk_verbose = True

        if status != sl.ERROR_CODE.SUCCESS:
            print(repr(status))
            zed_list[index].close()


        obj_param = sl.ObjectDetectionParameters()
        # Different model can be chosen, optimizing the runtime or the accuracy
        obj_param.detection_model = sl.DETECTION_MODEL.HUMAN_BODY_ACCURATE
        obj_param.body_format = sl.BODY_FORMAT.POSE_34 
        obj_param.enable_tracking = True
        obj_param.image_sync = True
        obj_param.enable_mask_output = False
        # Optimize the person joints position, requires more computations
        obj_param.enable_body_fitting = True
        # Create a Camera object
        

        camera_infos = zed_list[index].get_camera_information()
        if obj_param.enable_tracking:
            positional_tracking_param = sl.PositionalTrackingParameters()
            # positional_tracking_param.set_as_static = True
            positional_tracking_param.set_floor_as_origin = True
            zed_list[index].enable_positional_tracking(positional_tracking_param)

        print("Object Detection: Loading Module...")

        err = zed_list[index].enable_object_detection(obj_param)
        if err != sl.ERROR_CODE.SUCCESS:
            print(repr(err))
            zed_list[index].close()
            exit(1)

        objects = sl.Objects()
        obj_runtime_param = sl.ObjectDetectionRuntimeParameters()
        # For outdoor scene or long range, the confidence should be lowered to avoid missing detections (~20-30)
        # For indoor scene or closer range, a higher confidence limits the risk of false positives and increase the precision (~50+)
        obj_runtime_param.detection_confidence_threshold = 40
        # Open the camera
        #err = zed.open(init_params)
        #if err != sl.ERROR_CODE.SUCCESS:
        #    exit(1)
        index = index +1

    #Start camera threads
    for index in range(0, len(zed_list)):
        if zed_list[index].is_opened():
            thread_list.append(threading.Thread(target=grab_run, args=(index,)))
            thread_list[index].start()
    
    #Display camera images
    key = ''
    while key != 113:  # for 'q' key
        err = zed_list[index].retrieve_objects(objects, obj_runtime_param)
        print("I am in while loop.")
        index = 0
        for index in range(0, len(zed_list)):
            if zed_list[index].is_opened():
                if objects.is_new:
                    obj_array = objects.object_list
                    print(str(len(obj_array)) + " Person(s) detected\n")
                    if len(obj_array) > 0:
                        first_object = obj_array[0]
                        print("First Person attributes:")
                        print(" Confidence (" + str(int(first_object.confidence)) + "/100)")
                        if obj_param.enable_tracking:
                            print(" Tracking ID: " + str(int(first_object.id)) + " tracking state: " + repr(
                                first_object.tracking_state) + " / " + repr(first_object.action_state))
                        position = first_object.position
                        velocity = first_object.velocity
                        dimensions = first_object.dimensions
                        #print(" 3D position: [{0},{1},{2}]\n Velocity: [{3},{4},{5}]\n 3D dimentions: [{6},{7},{8}]".format(
                        #    position[0], position[1], position[2], velocity[0], velocity[1], velocity[2], dimensions[0],
                        #    dimensions[1], dimensions[2]))
                        if first_object.mask.is_init():
                            print(" 2D mask available")

                        #print(" Keypoint 2D ")
                        keypoint_2d = first_object.keypoint_2d
                        #for it in keypoint_2d:
                        #    print("    " + str(it))
                        #print("\n Keypoint 3D ")
                        keypoint = first_object.keypoint
                        for it in keypoint:
                            print("   fsdfsf " + str(it))
                            writer.writerow(it)
                        writer.writerow('---')    
                        #input('\nPress enter to continue: ')
                        #writer.writerow(position)
                        #print(position)
                        #writer.writerow(velocity)
                        #writer.writerow(dimesnsion)
        
        key = cv2.waitKey(10)
    cv2.destroyAllWindows()

    #Stop the threads
    stop_signal = True
    for index in range(0, len(thread_list)):
        thread_list[index].join()

    print("\nFINISH")

if __name__ == "__main__":
    main()

Hi,

Can you please give us more details about what you are trying to achieve and the issues you are facing please?

Thanks a lot.

Best regards,

Stereolabs Support