ZED-深度感知使用

文章目录

  • 1.深度感知配置
  • 2.得到深度数据
      • 2.1.得到深度值
  • 3.展示深度图
  • 4.获取点云数据
      • 4.1.从点云数据中计算距离
  • 5.得到法线图像
  • 6.调整深度分辨率

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()可以用来检索一个深度图,置信度图,普通图像,或者点云

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的三维点云数据,可以通过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矩阵(X,Y,Z,空),其中X,Y,Z值编码法向量的方向

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)

官方文档地址

你可能感兴趣的:(ZED,计算机视觉,计算机视觉)