When calling get_data() on a depth Mat that was generated by calling retrieve_measure(depth_map, sl.MEASURE.DEPTH_U16_MM), the function returns correct values for all rows that are less than half the height of the mat, but returns all zeros for all rows beyond that.
Example images, side by side:
I adjusted the levels in the depth image to make the issue more obvious, but I am correctly getting 16-bit values that accurately reflect the depth at each pixel where there are non-zero values.
InitParameters:
Resolution: HD720
FPS: 30
Depth mode: Ultra
Coordinate units: Meter
RuntimeParameters:
Sensing mode: Standard
Reference frame: World
Minimum viable example:
import pyzed.sl as sl
import sys
from pathlib import Path
import numpy as np
import cv2.cv2 as cv2
def main():
if not sys.argv or len(sys.argv) != 2:
sys.stdout.write("Usage: \n\n")
sys.stdout.write("python test_16_bit_depth_array.py <output path>")
exit(-2)
output_path = Path(sys.argv[1])
zed = sl.Camera()
init_params = sl.InitParameters()
init_params.camera_resolution = sl.RESOLUTION.HD720
init_params.camera_fps = 30
init_params.depth_mode = sl.DEPTH_MODE.ULTRA
init_params.coordinate_units = sl.UNIT.METER
init_params.depth_maximum_distance = 3.0
err = zed.open(init_params)
if err != sl.ERROR_CODE.SUCCESS:
exit(-1)
left_image = sl.Mat()
depth_map = sl.Mat()
point_cloud = sl.Mat()
runtime_params = sl.RuntimeParameters()
runtime_params.sensing_mode = sl.SENSING_MODE.STANDARD
runtime_params.measure3D_reference_frame = sl.REFERENCE_FRAME.WORLD
if zed.grab(runtime_params) == sl.ERROR_CODE.SUCCESS:
zed.retrieve_image(left_image, sl.VIEW.LEFT)
zed.retrieve_measure(depth_map, sl.MEASURE.DEPTH_U16_MM)
zed.retrieve_measure(point_cloud, sl.MEASURE.XYZRGBA)
color_path = "{}\\color.png".format(output_path)
depth_path = "{}\\depth.png".format(output_path)
color_array = left_image.get_data()
depth_array = depth_map.get_data().astype(np.uint16)
cv2.imwrite(color_path, color_array)
cv2.imwrite(depth_path, depth_array)
zed.close()
exit(0)
if __name__ == "__main__":
main()