可以在初始化时使用InitParameters
,在运行时使用RuntimeParameters
在使用过程中改变特定参数
# Set configuration parameters
init_params = sl.InitParameters()
init_params.depth_mode = sl.DEPTH_MODE.ULTRA # Use ULTRA depth mode
init_params.coordinate_units = sl.UNIT.MILLIMETER # Use millimeter units (for depth measurements)
我们使用grab()
来抓取一个新的图像,并使用retrieveMeasure()
来检索左侧相机得到图像对齐的深度图。retrieveMeasure()
可以用来检索一个深度图,置信度图,普通图像,或者点云
image = sl.Mat()
depth_map = sl.Mat()
runtime_parameters = sl.RuntimeParameters()
if zed.grab(runtime_parameters) == SUCCESS :
# A new image and depth is available if grab() returns SUCCESS
zed.retrieve_image(image, sl.VIEW.LEFT) # Retrieve left image
zed.retrieve_measure(depth_map, sl.MEASURE.DEPTH) # Retrieve depth
深度图为每个(x,y)
像素存储了一个深度Z
(32-bit 浮点数)。我们想要得到这个值,可以使用get_value
depth_value = depth_map.get_value(x,y)
默认情况下,深度值是以毫米
为单位的,可以使用InitParameters::coordinate_units
修改单位
32-bit深度图可以显示为8-bit灰度图像。为了显示深度图,我们它的值映射到[0, 255]
,255(白色)
代表最近的深度值,0(黑色)
代表最远的深度值。我们将这个过程称作深度标准化。要检索深度图像,使用retrieveImage(depth,VIEW_DEPTH)
。在应用程序中,不要将8位深度图像用于显示深度以外的其他目的
depth_for_display = sl.Mat()
zed.retrieve_image(depth_for_display, sl.VIEW.DEPTH)
展示需要用到opencv
,cv2.imshow()
默认使用numpy数组
,因此我们需要将深度图转换成ndarray
再显示
depth_image_show = depth_for_display.get_data()
cv2.imshow('depth image', depth_image)
以(x,y,z)
为坐标,保留RGBA color
的三维点云数据,可以通过retrieveMeasure()
来得到
point_cloud = sl.Mat()
zed.retrieve_measure(point_cloud, sl.MEASURE.XYZRGBA)
为了得到某个像素的值,我们可以使用getValue()
函数
# Get the 3D point cloud values for pixel (i,j)
point3D = point_cloud.get_value(i,j)
x = point3D[0]
y = point3D[1]
z = point3D[2]
color = point3D[3]
点云数据存储格式为4 channel
,每个channel
都是一个32-bit浮点数
。最后一个浮点数存的是color
信息,R,G,B,alpha(4 x 8-bit)
连接在一起,成了一个32-bit浮点数
。我们可以选择不同形式的color
格式,比如BGRA
,通过retrieveMeasure(point_cloud, MEASURE::XYZBGRA)
直接计算欧式距离,就能得到物体距离左边相机的距离
# Measure the distance of a point in the scene represented by pixel (i,j)
point3D = point_cloud.get_value(i,j)
distance = math.sqrt(point3D[0]*point3D[0] + point3D[1]*point3D[1] + point3D[2]*point3D[2])
表面法线可以通过retrieveMeasure(normal_map, MEASURE_NORMALS)
来得到。法线映射对于可通过性估计和实时照明很有用。输出是一个4通道32-bit
矩阵(X,Y,Z,空)
,其中X,Y,Z
值编码法向量的方向
为了提高应用程序的性能并加速数据采集,我们可以通过在retrievmeasure()
中指定宽度和高度参数来检索较低分辨率的测量。我们还可以指定在CPU (RAM)或GPU内存中使用可用数据的位置。
point_cloud = sl.Mat()
# Retrieve a resized point cloud
# width and height specify the total number of columns and rows for the point cloud dataset
width = zed.get_resolution().width / 2
height = zed.get_resolution().height / 2
zed.retrieve_measure(point_cloud, sl.MEASURE.XYZRGBA, sl.MEM.GPU, width, height)
官方文档地址