ZED-深度感知使用

1.深度感知配置

您可以在初始化时使用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)

2.得到深度数据

我们使用grab()抓取新图像,使用retrieveMeasure()从左侧摄像头检索图像对齐的深度图。 retrieveMeasure() 可用于检索深度图、置信度(Confidence)图、法线图像或点云

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

2.1.得到深度值

深度图为每个(x,y)像素存储了一个深度Z(32-bit 浮点数)。我们想要得到这个值,可以使用get_value

depth_value = depth_map.get_value(x,y)

默认情况下,深度值在毫米内,可以使用InitParameters::coordinate_units修改单位

3.展示深度图

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)

显示需要使用opencvcv2.imshow()默认使用numpy数组,所以我们需要将深度图转换为ndarray并显示

depth_image_show = depth_for_display.get_data()
cv2.imshow('depth image', depth_image)

4.获取点云数据

(x,y,z)为坐标,保留RGBA color的3D点云数据,可通过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)

4.1.从点云数据中计算距离

通过直接计算欧几里得距离,可以得到物体到左边相机的距离。

# 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])

5.得到法线图像

表面法线可以通过retrieveMeasure(normal_map, MEASURE_NORMALS)来得到。法线映射对于可通过性估计和实时照明很有用。输出是一个4通道32-bit矩阵(matrix)(X,Y,Z,空),其中X,Y,Z值编码(code)法向量的方向

6.调整深度分辨率

为了提高应用程序的性能并加速数据采集,我们可以通过在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)

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2022年3月25日 下午1:03
下一篇 2022年3月25日 下午1:10

相关推荐