Hello,
I currently have many .svo files of video recordings from a ZED2 stereo camera. I would like to merge the left and right views of these .svo recordings so that I can perform different detections on the merged video.
Could you tell me how to do this or provide me with a python code that allows this?
A colleague allowed me to merge these two views directly during the recording but I would have to do this on already recorded views.
Hi,
You can use a SVO file just like a real camera. I mean, you can use the code from your colleague by just changing the input from the ZED to the SVO file.
Antoine
Hi,
I found this python code that I made some changes to and that I think works. Can you confirm this for me? Thank you for your help.
"""
########################################################################
#
# 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.
#
########################################################################
"""
Read SVO sample to read the video and the information of the camera. It can pick a frame of the svo and save it as
a JPEG or PNG file. Depth map and Point Cloud can also be saved into files.
"""
import sys
import pyzed.sl as sl
import cv2
def main():
# if len(sys.argv) != 2:
# print("Please specify path to .svo file.")
# exit()
#filepath = sys.argv[1]
filepath = "C:\\Users\\Simpro\\Desktop\\Data_simpro\\save\\2022_11_12\\ME_20221112-090735_cam0.svo"
print("Reading SVO file: {0}".format(filepath))
input_type = sl.InputType()
input_type.set_from_svo_file(filepath)
init = sl.InitParameters(input_t=input_type, svo_real_time_mode=False)
cam = sl.Camera()
status = cam.open(init)
if status != sl.ERROR_CODE.SUCCESS:
print(repr(status))
exit()
runtime = sl.RuntimeParameters()
mat = sl.Mat()
key = ''
print(" Save the current image: s")
print(" Quit the video reading: q\n")
while key != 113: # for 'q' key
err = cam.grab(runtime)
if err == sl.ERROR_CODE.SUCCESS:
cam.retrieve_image(mat)
cv2.imshow("ZED", mat.get_data())
key = cv2.waitKey(1)
saving_image(key, mat)
else:
key = cv2.waitKey(1)
cv2.destroyAllWindows()
print_camera_information(cam)
cam.close()
print("\nFINISH")
def print_camera_information(cam):
while True:
res = input("Do you want to display camera information? [y/n]: ")
if res == "y":
print()
print("Distorsion factor of the right cam before calibration: {0}.".format(
cam.get_camera_information().calibration_parameters_raw.right_cam.disto))
print("Distorsion factor of the right cam after calibration: {0}.\n".format(
cam.get_camera_information().calibration_parameters.right_cam.disto))
print("Confidence threshold: {0}".format(cam.get_runtime_parameters().confidence_threshold))
print("Depth min and max range values: {0}, {1}".format(cam.get_init_parameters().depth_minimum_distance,
cam.get_init_parameters().depth_maximum_distance)
)
print("Resolution: {0}, {1}.".format(round(cam.get_camera_information().camera_resolution.width, 2), cam.get_camera_information().camera_resolution.height))
print("Camera FPS: {0}".format(cam.get_camera_information().camera_fps))
print("Frame count: {0}.\n".format(cam.get_svo_number_of_frames()))
break
elif res == "n":
print("Camera information not displayed.\n")
break
else:
print("Error, please enter [y/n].\n")
def saving_image(key, mat):
if key == 115:
img = sl.ERROR_CODE.FAILURE
while img != sl.ERROR_CODE.SUCCESS:
filepath = input("Enter filepath name: ")
img = mat.write(filepath)
print("Saving image : {0}".format(repr(img)))
if img == sl.ERROR_CODE.SUCCESS:
break
else:
print("Help: you must enter the filepath + filename + PNG extension.")
if __name__ == "__main__":
main()
Hi, I think this code saves the left image to the disk.
Hello,
How do you see it?
This is the code that seems to work when registering, would it be possible to adapt it? If so, how? Can you show me?
Thanks in advance.
########################################################################
#
# Copyright (c) 2020, 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.
#
########################################################################
"""
Multi cameras sample showing how to open multiple ZED in one program
"""
import queue
import pyzed.sl as sl
import cv2
import numpy as np
import threading
import time
import signal
zed_list = []
left_list = []
depth_list = []
timestamp_list = []
thread_list = []
stop_signal = False
left_images_q = queue.Queue(maxsize=10)
def signal_handler(signal, frame):
global stop_signal
stop_signal = True
time.sleep(0.5)
exit()
def grab_run():
"""
This function grabs frames from the cameras and put them in a queue. Used in a separated thread.
"""
global stop_signal
global zed_list
global timestamp_list
global left_list
global depth_list
global left_images_q
runtime = sl.RuntimeParameters()
while not stop_signal:
err = [0] * len(zed_list)
for index in range(len(zed_list)):
err[index] = zed_list[index].grab(runtime)
for index in range(len(zed_list)):
if err[index] == sl.ERROR_CODE.SUCCESS:
total_frames_list[index] += 1
zed_list[index].retrieve_image(left_list[index], sl.VIEW.LEFT)
timestamp_list[index] = zed_list[index].get_timestamp(sl.TIME_REFERENCE.IMAGE).data_ns
if not left_images_q.full():
err_frame = left_images_q.put_nowait(left_list)
time.sleep(0.001) # 1ms
for index in range(len(zed_list)):
zed_list[index].close()
def main():
global stop_signal
global zed_list
global left_list
global depth_list
global timestamp_list
global thread_list
global left_images_q
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
# List and open cameras
name_list = []
last_ts_list = []
cameras = sl.Camera.get_device_list()
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())
timestamp_list.append(0)
last_ts_list.append(0)
status = zed_list[index].open(init)
if status != sl.ERROR_CODE.SUCCESS:
print(repr(status))
zed_list[index].close()
index = index + 1
# Start camera thread
cam_thread = threading.Thread(target=grab_run)
cam_thread.start()
camera_info = zed_list[0].get_camera_information()
display_resolution = sl.Resolution(min(camera_info.camera_resolution.width, 1280),
min(camera_info.camera_resolution.height, 720))
image_scale = [display_resolution.width / camera_info.camera_resolution.width,
display_resolution.height / camera_info.camera_resolution.height]
# Display camera images
key = ''
interations = 0
while key != 113: # for 'q' key
left_imgs = left_images_q.get(block=True, timeout=10)
for index in range(0, len(zed_list)):
if zed_list[index].is_opened():
if timestamp_list[index] > last_ts_list[index]:
cv2.imshow(name_list[index], left_imgs[index].get_data())
# x = round(depth_list[index].get_width() / 2)
# y = round(depth_list[index].get_height() / 2)
last_ts_list[index] = timestamp_list[index]
key = cv2.waitKey(10)
interations += 1
cv2.destroyAllWindows()
# Stop the threads
stop_signal = True
cam_thread.join()
print("\nFINISH")
if __name__ == "__main__":
main()
`