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